Пытаюсь вызвать из своей С-шной программы ассемблерную процедуру 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
\ 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.