質問は AVR GCC コンテキストにあります。
次のように、C関数プロトタイプを含む.sファイルがあります。
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 構文が使用されていることを意味します。今、私が理解しようとしているのは、C 関数のプロトタイピングに関して、これらの定数 24、22、20 は何を意味するのかということです。コメントは、関数の引数をロードしていることを示唆していますが、.set とそれらの定数を使用してそれがどのように行われるかわかりません。以前は、パラメーターはスタックとレジスターを介して渡されると考えていました。
二次的な質問 - AVR asm が GNU から派生したものであることは知っていますが、上記のように GNU asm 構文と AVR asm を本当に混在させることはできますか?