我是汇编的新手(我使用带有AVR程序集的Arduino Uno),我无法弄清楚如何从汇编函数返回超过1个字节的变量。到目前为止,我只需要返回字节,我只需将mov
和ldi
的r24寄存器修改为我想要返回的值。当我调用ret
时,该函数将寄存器r24中的值返回给C中的程序。但是,如何返回大于8字节的值?基本上,我如何使用内存而不是寄存器。
答案 0 :(得分:1)
在评论中链接的页面(gcc.gnu.org/wiki/avr-gcc)上阅读“#34;呼叫约定”和#34;一章。不幸的是,它比其他CPU更复杂。
如果返回的值长于8个字节,C编译器将分配内存并在寄存器R25:R24中传递内存地址。
所有参数都被转移" down"由两个寄存器。例如:
byte someFunction1(byte a, byte b);
a -> R24
b -> R22
return -> R24
struct largeStructure someFunction2(byte a, byte b);
a -> R22 (instead of R24)
b -> R20 (instead of R22)
address of tmp_mem -> R25:R24
return -> in memory tmp_mem
如果返回的值最多8个字节长,则在以下寄存器中返回该值:
1 byte: R24
2 bytes: R24...R25
3 bytes: R22...R24
4 bytes: R22...R25
5 bytes: R20...R24
6 bytes: R20...R25
7 bytes: R18...R24
8 bytes: R18...R25