将超过1个字节返回到汇编中的函数

时间:2016-11-27 06:03:31

标签: assembly avr

我是汇编的新手(我使用带有AVR程序集的Arduino Uno),我无法弄清楚如何从汇编函数返回超过1个字节的变量。到目前为止,我只需要返回字节,我只需将movldi的r24寄存器修改为我想要返回的值。当我调用ret时,该函数将寄存器r24中的值返回给C中的程序。但是,如何返回大于8字节的值?基本上,我如何使用内存而不是寄存器。

1 个答案:

答案 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