реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Calling conventions, Проблемы при вызове ассемблерной процедуры из С
Zlumd
сообщение Apr 21 2010, 07:40
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 25 2010, 21:29
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Так все правильно! Все параметры в регистры не помещаются! Помещаются только первые 4 указателя, а 1 байт true и 2 байта = 2 кладутся в CSTACK. Все в соотв. с IAR AVR calling conversion
Go to the top of the page
 
+Quote Post
Zlumd
сообщение Apr 28 2010, 01:44
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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 на место. Т.е. получаются, что они содержат серьезные баги.
Go to the top of the page
 
+Quote Post
_Bill
сообщение May 14 2010, 03:44
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Zlumd
сообщение May 17 2010, 04:10
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057



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

Сообщение отредактировал Zlumd - May 17 2010, 04:11
Go to the top of the page
 
+Quote Post
_Bill
сообщение May 17 2010, 08:46
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Zlumd @ May 17 2010, 08:10) *
В апноте AVR1317 четко написано, что эти функции предназначены для работы с IARом.

Там два варианта функций - для IAR и GCC. Какой вариант вы используете?
Go to the top of the page
 
+Quote Post
Zlumd
сообщение May 19 2010, 06:32
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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 байта, что в конце концов приводит к выходу за границы стека.
Go to the top of the page
 
+Quote Post
Zlumd
сообщение May 25 2010, 14:39
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057



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


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01452 секунд с 7
ELECTRONIX ©2004-2016