Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Calling conventions
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Zlumd
Не подскажет ли уважаемый All что-нибудь по следующему вопросу:

Пытаюсь вызвать из своей С-шной программы ассемблерную процедуру DES_CBC_Encrypt из атмеловского апнота AVR1317. Вижу в дебаггере, что после вызова процедуры адреса всех локальных переменных уменьшаются на 3 байта (при модели памяти Small). При модели памяти Large или Huge адреса всех локальных переменных уменьшаются на 8 байт.

Вот что компилируется при модели памяти Small при оптимизации None:
Код
    966           DES_CBC_Encrypt(Buf+1,Buf+1,pKey,pChainBlock,true,2);
   \   000000BA   E002               LDI     R16, 2
   \   000000BC   E010               LDI     R17, 0
   \   000000BE   931A               ST      -Y, R17
   \   000000C0   930A               ST      -Y, R16
   \   000000C2   E001               LDI     R16, 1
   \   000000C4   930A               ST      -Y, R16
   \   000000C6   01BE               MOVW    R23:R22, R29:R28
   \   000000C8   5E64               SUBI    R22, 228
   \   000000CA   4F7F               SBCI    R23, 255
   \   000000CC   01A2               MOVW    R21:R20, R5:R4
   \   000000CE   019E               MOVW    R19:R18, R29:R28
   \   000000D0   5F2C               SUBI    R18, 252
   \   000000D2   4F3F               SBCI    R19, 255
   \   000000D4   018E               MOVW    R17:R16, R29:R28
   \   000000D6   5F0C               SUBI    R16, 252
   \   000000D8   4F1F               SBCI    R17, 255
   \   000000DA   ........           CALL    DES_CBC_Encrypt

Похоже, что три команды ST -Y, Rxx и смещают указатель стека. Это глюк IARa или я просто не умею им пользоваться? Подскажите, что не так.
Использую IAR AVR v5.30.
Процессор ATXmega128A1.
KRS
Так все правильно! Все параметры в регистры не помещаются! Помещаются только первые 4 указателя, а 1 байт true и 2 байта = 2 кладутся в CSTACK. Все в соотв. с IAR AVR calling conversion
Zlumd
Цитата(KRS @ Apr 26 2010, 04:29) *
Так все правильно! Все параметры в регистры не помещаются! Помещаются только первые 4 указателя, а 1 байт true и 2 байта = 2 кладутся в CSTACK. Все в соотв. с IAR AVR calling conversion
Подскажи, пожалуйста, в соответствии с IAR AVR calling conversion кто должен заботиться о возвращении указателя CSTACK на место после выполнения подпрограммы:
Код вызывающий подпрограмму или вызываемая подпрограмма?
Методом научного тыка я выяснил, что это должна делать вызываемая подпрограмма. Правильно?
У Атмела процедуры DES_CBC_Encrypt и DES_CBC_Decrypt не возвращают CSTACK на место. Т.е. получаются, что они содержат серьезные баги.
_Bill
Цитата(Zlumd @ Apr 28 2010, 05:44) *
Подскажи, пожалуйста, в соответствии с IAR AVR calling conversion кто должен заботиться о возвращении указателя CSTACK на место после выполнения подпрограммы:
Код вызывающий подпрограмму или вызываемая подпрограмма?
Методом научного тыка я выяснил, что это должна делать вызываемая подпрограмма. Правильно?
У Атмела процедуры DES_CBC_Encrypt и DES_CBC_Decrypt не возвращают CSTACK на место. Т.е. получаются, что они содержат серьезные баги.

Не должно быть там никаких "багов". Просто эти процедуры не рассчитаны для совместной работы с IAR. И вообще, CSTACK это программно реализованный стек данных, который используется только в IAR.
Zlumd
Цитата(_Bill @ May 14 2010, 10:44) *
Не должно быть там никаких "багов". Просто эти процедуры не рассчитаны для совместной работы с IAR. И вообще, CSTACK это программно реализованный стек данных, который используется только в IAR.
В апноте AVR1317 четко написано, что эти функции предназначены для работы с IARом.
_Bill
Цитата(Zlumd @ May 17 2010, 08:10) *
В апноте AVR1317 четко написано, что эти функции предназначены для работы с IARом.

Там два варианта функций - для IAR и GCC. Какой вариант вы используете?
Zlumd
Цитата(_Bill @ May 17 2010, 15:46) *
Там два варианта функций - для IAR и GCC. Какой вариант вы используете?
Я использую вариант для IAR.
Если, быть точным я использую файл DES_driver_speed.s90
Я также пробовал DES_driver_size.s90
Там точно такой же глюк. Указатель CSTACK после каждого вызова функции уменьшается на 3 байта, что в конце концов приводит к выходу за границы стека.
Zlumd
Нашел еще один косяк, возникающий при использовании DES-процедур апнота AVR1317.
Эти процедуры можно использовать в XMegax, где нет регистров RAMPX...RAMPZ, либо следить за тем, чтобы эти регистры были равны 0. Если же в регистрах RAMPX...RAMPZ лежат какие-то случайные значения, то и указатели будут указывать в случайное место в памяти.
В принципе, в описании сказано, что эти процедуры предназначены для модели памяти Small, но там нигде не сказано, что я вообще нигде не имею права использовать указатели типа __huge.
В связи с этим вопрос. Если IAR передает в процедуру указатель типа __near в регистре Z (R30:R31), то кто должен заботиться об обнулении RAMPZ ? Вызывающий код или вызываемая подпрограмма?
Сергей Борщ
Цитата(Zlumd @ May 25 2010, 17:39) *
кто должен заботиться об обнулении RAMPZ ? Вызывающий код или вызываемая подпрограмма?
Вы хотите, чтобы мы прочитали документацию на компилятор и пересказали вам нужный абзац? Больше, чем написано в документации ни один участник вам гарантировать не сможет.
Элементарная логика подсказывает, что если функции надо для своих нужд изменить SFR (коим является RAMPx), то она же должна его восстановить. В противном случае вызывающая функция обязана будет делать это даже в том случае, если в вызываемой никакого обращения по указателю не происходит. Но точный ответ даст вам только документация.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.