0

質問は 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 を本当に混在させることはできますか?

4

1 に答える 1

0

AVR は最初のいくつかの引数を渡すためにレジスタを使用します。ここで呼び出し規約の説明を参照してください。

レジスタは、アドレス 0 にメモリ マップされます。そのため、貼り付けられたコードに表示される番号は、レジスタ番号と同じアドレスであり、メモリ マッピングを通じて引数を参照するために使用できます。

于 2012-12-02T15:07:02.170 に答える