C函数原型和.set指令

时间:2012-12-02 13:53:42

标签: assembly avr avr-gcc

问题出在AVR GCC背景下。

我的.s文件包含C函数原型如下:

Mod_BigNum_by_u8: .global Mod_BigNum_by_u8 
; c-prototype ==> uint8_t Mod_BigNum_by_u8(uint8_t * pBigNum, uint8_t ByteCount, uint8_t Divisor); 

; Parameters 
    .set pBigNum, 24        ; (u16) pointer to the BigNum Dividend.  Highbyte first 
    .set ByteCount, 22      ; (u8) number of bytes in the BigNum 
    .set Divisor, 20        ; (u8) Divisor 

; Local Variables 
    .set BitCount, 23       ; (u8) Number of bits left in the current byte 
    .set CurrentByte, 21    ; (u8) Most recently used byte of BigNum 

; Return value 
    .set Dividend, 24       ; (u16) result (we only need 8bits, but WinAVR requires 16) 
... 

以上功能在Atmel Studio中运行正常(我想说“用avr-gcc编译”)。

GNU asm syntax 
Syntax: .set symbol, expression 

AVR asm 
.SET label = expression 

这意味着使用GNU语法。现在我想要了解的是 - 那些常数24,22,20在C函数原型方面意味着什么?评论建议我正在加载函数参数,但我不明白.set和它们发生的那些常量。我以前认为params是通过堆栈和寄存器传递的。

次要问题 - 我知道AVR asm是从GNU派生的,但是我真的可以将GNU asm语法和AVR asm混合起来吗?

1 个答案:

答案 0 :(得分:0)

AVR使用寄存器传递前几个参数。请参阅description of the calling convention here

寄存器在地址0处进行存储器映射。因此,您在粘贴代码中看到的数字是与寄存器编号相等的地址,可用于通过内存映射引用参数。