Jump to content
EugenOS

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Edited by tcoder

Share this post


Link to post
Share on other sites

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

в сегменте - SADDRP

пример

DSEG SADDRP

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

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

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

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

Edited by EugenOS

Share this post


Link to post
Share on other sites

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

long __saddr eax, ebx, ecx, edx;

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

    extern eax	
    extern ebx	
    extern ecx	
    extern edx	

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

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

Выбор подходящего элемента питания, способного обеспечивать требуемый уровень напряжения и выдавать необходимый ток на протяжении всего периода эксплуатации беспроводной пожарно-охранной системы является одной из первостепенных задач. Наиболее подходящим для этих целей элементом являются литий-тионилхлоридные элементы питания, а одним из наиболее конкурентоспособных производителей – компания Fanso, предлагающая своим клиентам продукты как универсальные, так и разработанные специально для решения конкретных задач.

Подробнее...

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Когда учился ещё, мы суп варили. Плитки не было, у девушек утюг попросили...На х\б лучше греет. 
    • На практике не будет никакой разницы, можешь ставить смело. 
    • Вот тоже не плохой вариант  sihg20n5.pdf
    • Чистый класс б подразумевает работу транзистора "в конце" излома характеристики, где ТП>0. Если предположить, что ТП=0, то это не означает, что Uвых=0, и одному из плеч придётся приоткрыться, чтобы реализовать это. Но если всё плохо (И ТП=0, и Uвых=0), то "выход" будет "метаться" меж двух состояний (чуть в + чуть в -), чтобы на ёмкости, подключенной к выходу и внутри схемы усилителя (а их очень много и они ограничивают его быстродействие) было такое напряжения, чтобы узел сравнения "думал", что на выходе всё в порядке. Но если всё очень плохо (и ТП=0, и Uвых=0, и С=0), то усилитель будет чувствовать себя так же, как описано выше, но "метаться" от + к - будет очень быстро и с большим размахом, т.к. эл.ток распространяется по проводам не мгновенно, а с некоторой конечной скоростью (т.е. "весть" о нормализации состояния будет приходить с запаздыванием, а меры по нормализации состояния будут приниматься непрерывно). Но если... С уважением В.  
    • на работе взял подошву утюга, закрепил на корпусе от АТХ ИИП, сохранив терморегулятор утюга - порядка 150-160 градусов поставил и все ... Хотя тоже лежит отдельная круглая нагревалка от чайника и куча диммеров , даже с дросселями , от пылесосов ... руки не доходят скрестить .... температура фиксированная? Точность поддержания? Может просто термостаты на размыкание-замыкание, как на бойлерах и т.п.?
    • так чем тебе не хватает тогда МОНИТОР-а и его закрытых ПРОФ-разделов?! Или ты в них не вхож?! Ты же понимаешь, что тут можно пересчитать по пальцам тех, кто сможет войти в подобный предлагаемый тобой раздел? А зачем ЭТО, если кому нужно - и так спросят напрямую. Если инфа не закрыта ТАМ или моя личная - я всегда подскажу, если вопрошающий "натянул по Сеньке шапку", а не "Клиент, играющий в мастера". Так что даст закрытый клуб ТУТ? Да и что тут прятать, если 99,(9)% ремонта тут от залетных гостей уровня "туподаун" и звучат как "где копать"?! 
    • Спасибо, а то что касается катушек, их ведь две, одна по питанию вторая на выход, например если я по калькулятору получаю 8 витков, как мотать, по 4 на каждую?
×
×
  • Create New...