Перейти к содержанию

Iar Assembler 78K0S, Как Правильно Задать Переменную В Saddr


EugenOS

Рекомендуемые сообщения

Доброго дня всем.

Имею непонятки с асмом IAR.

;------------------------------------------------------------------------------
load_const_32 macro   freg,c_hi,c_lo
 movw AX, #(c_lo)
 movw freg, AX
 movw AX, #(c_hi)
 movw freg+2, AX
    endm
;-----------------------------------------------------------------------------
    SADDR   EVEN  ; Задаем сегмент данных с короткой адресацией, при этом с привязкой к четным адресам (чтобы адресация слов работала верно)
PUBLIC eax
PUBLIC ebx
PUBLIC ecx
PUBLIC edx
m0:	 DS  4
m1:	 DS  4
eax:    DS  4
ebx:    DS  4
ecx:    DS  4
edx:    DS  4
;-----------------------------------------------------------------------------
	   RSEG CODE ; сегмент кода, релоцируемый
 load_const_32  eax, 4503H,114FH

 movw AX, #(0x114F) ; то же самое что делает макрос
 movw S:eax, AX ;  только я попробовал явно указать короткую адреацию
 movw AX, #(0x4503)
 movw S:eax+2, AX

так вот. ругается (варнингом) на все строки содержащие movw eax,AX ; mov eax, A и т.п. (т.е. где учавствует любая переменная из объявленных выше).

Warning[400]: Number out of range ....

post-42854-0-44432400-1399329147_thumb.jpg

На рисунке то что в list файле, сверху в рамку выделен развернувшийся макрос, снизу первый из двух варнингов после макроса. Как бы отличий не вижу...и не пойму чего ему надо.

Как я предполагаю, он хочет чтоб я ему указал что переменные находятся в saddr, но где ему этого не хватает в объявлении переменных, в написании операндов или может еще где?

Кто с иаром дружит - подскажите.

Ссылка на комментарий
Поделиться на другие сайты

В IAR и 78K0S мало понимаю, но складывается впечатление, что дело всё же в чётности.

В расшифровке варнинга есть подозрительная нечётная цифра 1

mov eax+2,ax - это команда, это понятно

Warning[400]: Number out of range - предупреждение о "выходе за пределы", это тоже понятно

movw \1+2,AX - расшифровка, но непонятно, почему 1+2 ? как будто адрес нечётный и начинается с 1.

---------------^

Если Вы сами не знаете, что это за 1, попробуйте переменную EBX подставить, если эта циферка заменится на 5, значит точно адреса нечётные. Второй способ проверить - подставить однобайтовую переменную перед всеми 32-ух битными и посмотреть, пропадут ли варнинги.

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

Я размещаю перенные типа "WORD"

в сегменте - SADDRP

пример

DSEG SADDRP

TESTDATA: DS 1 ; резервирую память 2байта для переменной "TESTDATA"

Среда программирования "PMplus"

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я такое пробовал уже. Добавляет еще ошибку " Error[428]: Address operand must be even"

По-идее сегмент релоцируемый и кроме того перед объявлением стоит привязка к четным адресам. Как я понял эти самые \1 ...\2 и т.п. это ссылки на параметры макроса...в реальности он туда пихает 0x10...0x13 для eax 0x14..0x17 для ebx и т.п.

проблема в том что адреса эти адреса как бы отданы уже под MUL, DIV и другие SFR

PM Plus не катит...во-первых под 7 не работает нормально, во-вторых софтового отладчика нет

P.S. я и пытаюсь переложить из под PM+. Кстати именно по этому не один параметр 32-х битной константы, а два двухбайтных. В отличии от IAR, PM+ не подддерживает 32-х битные интегеры в параметрах макроса. пришлось разбивать, когда пытался в ПМ+ работать. А тут еще не исправил на 32-х битные

В иаре, почему-то нет SADDRP

Изменено пользователем EugenOS
Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Короче сделал проще. объявил переменные в главном модуле на С++:

long __saddr eax, ebx, ecx, edx;

а на асме объявил их как внешние.

    extern eax	
    extern ebx	
    extern ecx	
    extern edx	

Костыль конечно, но т.к. все равно главный модуль на сях, то и фиг с ним. Главное - работает.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Проверил в IAR Вашу конструкцию - предупреждение тоже "Warning[400]: Number out of range".

Вспомнил, я пару лет назад пытался перевести свои проекты на ассемблере с "PM Plus" в "IAR" и загвоздка как раз была с переменными типа "WORD" c областью "SADDRP", вопрос не решив остался в "PM Plus".

Хотя эта среда программирования "PM Plus" порядком надоела из - за не предсказуемой реакцией на руские строчные буквы " э, ю, я ". C годами уже принаровился

На С++ конечно пойдёт, я программирую только на ASM , интересно было бы посмотреть на решение.

Ссылка на комментарий
Поделиться на другие сайты

Ну я как бы показал уже решение. На СИ:

long __saddr eax, ebx, ecx, edx;
extern "C"{
  void myFunc(void)
}
void main(void)
{
  eax = 12345;
  myFunc()
  // ну  и так далее....
}

На асме:

  SADDR ; на всякий  случай, может и не надо
    extern eax
    extern ebx  
    extern ecx  
    extern edx  

    RSEG  CODE
    PUBLIC myFunc
myFunc:
    movw AX, #eax
    mov HL, AX
    mov A,[HL]
; ну и так далее

все здесь написанное лишь для примера. eax в си присваивается значение для иллюстрации, у меня в проекте это внутренние переменные функции написанной на асме, а самой функции передается указатель на буфер...но это уже совсем другая история

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • У меня в такой же коробочке KSGER, у них прошивки отличаются, но в общем да, жмёшь кнопку и накручиваешь что нужно.
    • Подскажи пожалуйста как правильно инициировать монтирование диска, и вообще помоги пожалуйста куском кода, который будет открывать файл. Этот пример я взял в интернете.
    • Почему по схеме плечи моста не зашунтированы диодами? Очень возможно, что причиной проблемы являются выбросы противоиндукции моторчика при искрении щеток. 
    • приведите конкретный пример тиристора/симистора на 16..25А , 40..50го класса , ну или хотя бы от 30го класса.
    • А по схемотехнике, что сейчас используют, "в моде"? Или по прежнему,"Ланзар" ?
    • Пояснить популярнее, неже сформулировал @Vslz, у меня вряд ли получится, разве что щепотку физики вдогонку. Мощность, которая выделяется на рукотворной фиктивной нагрузке, сотканной из пучка резисторов, блок питания берет не из воздуха, а потребляет из питающей сети. Если Вам известно, что электрическя мощность (в ее максимально упрощенном преподнесении) - это произведение напряжения и тока, то получается, что при наличии напряжения в сети через защитную лампу таки протекает ток, создающий на ней неизбежное падение напряжения (заметьте - в полном соответствии с законом Ома). В результате наблюдается явление, природа которого, собственно, и позволяет использовать спираль лампы в качестве бареттера - защитного ограничителя тока: часть напряжения сети банально не доходит до подопытного блока питания, "оседая" на лампе, что до предела затрудняет его запуск и вызывает неприятные акустические эффекты. Чем выше нагрузка на выходе (выходах) БП, тем больше потребляемый от сети ток, ярче свечение лампы и меньше шансов увидеть его успешный старт.
    • Шёл 2018 год... ОУ LME49710 Программа Visual Analyzer: Выход 2в, 1кгц - 0,0047 Выход 5в, 1кгц - 0,0061 Выход 2в, 6кгц - 0,0087 Выход 2в, 10кгц - 0,0096 Прграмма RMAA: 0,002
×
×
  • Создать...