• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
EugenOS

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

7 сообщений в этой теме

EugenOS    1

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

Имею непонятки с асмом 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, но где ему этого не хватает в объявлении переменных, в написании операндов или может еще где?

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

Поделиться сообщением


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
tcoder    276

В 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
rebuk    0

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

в сегменте - SADDRP

пример

DSEG SADDRP

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
EugenOS    1

Я такое пробовал уже. Добавляет еще ошибку " 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
EugenOS    1

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

long __saddr eax, ebx, ecx, edx;

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

    extern eax	
    extern ebx	
    extern ecx	
    extern edx	

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
rebuk    0

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
EugenOS    1

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

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 в си присваивается значение для иллюстрации, у меня в проекте это внутренние переменные функции написанной на асме, а самой функции передается указатель на буфер...но это уже совсем другая история

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас