|
|
  |
Calling conventions, Проблемы при вызове ассемблерной процедуры из С |
|
|
|
Apr 21 2010, 07:40
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057

|
Не подскажет ли уважаемый 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.
Сообщение отредактировал Zlumd - Apr 21 2010, 07:47
|
|
|
|
|
Apr 28 2010, 01:44
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057

|
Цитата(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 на место. Т.е. получаются, что они содержат серьезные баги.
|
|
|
|
|
May 14 2010, 03:44
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Zlumd @ Apr 28 2010, 05:44)  Подскажи, пожалуйста, в соответствии с IAR AVR calling conversion кто должен заботиться о возвращении указателя CSTACK на место после выполнения подпрограммы: Код вызывающий подпрограмму или вызываемая подпрограмма? Методом научного тыка я выяснил, что это должна делать вызываемая подпрограмма. Правильно? У Атмела процедуры DES_CBC_Encrypt и DES_CBC_Decrypt не возвращают CSTACK на место. Т.е. получаются, что они содержат серьезные баги. Не должно быть там никаких "багов". Просто эти процедуры не рассчитаны для совместной работы с IAR. И вообще, CSTACK это программно реализованный стек данных, который используется только в IAR.
|
|
|
|
|
May 17 2010, 04:10
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057

|
Цитата(_Bill @ May 14 2010, 10:44)  Не должно быть там никаких "багов". Просто эти процедуры не рассчитаны для совместной работы с IAR. И вообще, CSTACK это программно реализованный стек данных, который используется только в IAR. В апноте AVR1317 четко написано, что эти функции предназначены для работы с IARом.
Сообщение отредактировал Zlumd - May 17 2010, 04:11
|
|
|
|
|
May 17 2010, 08:46
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Zlumd @ May 17 2010, 08:10)  В апноте AVR1317 четко написано, что эти функции предназначены для работы с IARом. Там два варианта функций - для IAR и GCC. Какой вариант вы используете?
|
|
|
|
|
May 19 2010, 06:32
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057

|
Цитата(_Bill @ May 17 2010, 15:46)  Там два варианта функций - для IAR и GCC. Какой вариант вы используете? Я использую вариант для IAR. Если, быть точным я использую файл DES_driver_speed.s90 Я также пробовал DES_driver_size.s90 Там точно такой же глюк. Указатель CSTACK после каждого вызова функции уменьшается на 3 байта, что в конце концов приводит к выходу за границы стека.
|
|
|
|
|
May 25 2010, 14:39
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057

|
Нашел еще один косяк, возникающий при использовании DES-процедур апнота AVR1317. Эти процедуры можно использовать в XMegax, где нет регистров RAMPX...RAMPZ, либо следить за тем, чтобы эти регистры были равны 0. Если же в регистрах RAMPX...RAMPZ лежат какие-то случайные значения, то и указатели будут указывать в случайное место в памяти. В принципе, в описании сказано, что эти процедуры предназначены для модели памяти Small, но там нигде не сказано, что я вообще нигде не имею права использовать указатели типа __huge. В связи с этим вопрос. Если IAR передает в процедуру указатель типа __near в регистре Z (R30:R31), то кто должен заботиться об обнулении RAMPZ ? Вызывающий код или вызываемая подпрограмма?
|
|
|
|
|
May 25 2010, 15:18
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Zlumd @ May 25 2010, 17:39)  кто должен заботиться об обнулении RAMPZ ? Вызывающий код или вызываемая подпрограмма? Вы хотите, чтобы мы прочитали документацию на компилятор и пересказали вам нужный абзац? Больше, чем написано в документации ни один участник вам гарантировать не сможет. Элементарная логика подсказывает, что если функции надо для своих нужд изменить SFR (коим является RAMPx), то она же должна его восстановить. В противном случае вызывающая функция обязана будет делать это даже в том случае, если в вызываемой никакого обращения по указателю не происходит. Но точный ответ даст вам только документация.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|