この記事は旧バージョン(2000/08以前)のものです。これ以降newコア対応のためコール規約が変更になっています。

   AVR-GCCのインラインアセンブラ

インラインアセンブラの情報についてAVR-ML上での情報をもとに書きます。

・AVR-GCCで使用されるレジスタ

●関数のコール

注:new core のmovw命令導入に際しこれらのコール方法は変更される可能性があります。stable情報ではありません!!---->変更されました。以下は旧バージョンのものです(2000/08/07)

・レジスタの使用
Parameters Parameter1 Parameter2 Parameter3 Parameter4
f(p8,p8) R25 R24 - -
f(p8,p8,p8,p8) R25 R24 R23 R22
f(p16,p16) R25:R24 R23:R22 - -
f(p16,p16,p16) R25:R24 R23:R22 R21:R20 -
f(p32,p32) R25:R24:R23:R22 R21:R20:R19:R18 - -
f(p32,p32,p32) R25:R24:R23:R22 R21:R20:R19:R18 R17:R16:R15:R14 -
f(p8,p16,p32) R25 R24:R23 R22:R21:R20:R19 -

・戻り値
RetrunValue Registers
p8 R25:R24
p16 R25:R24
p32 R25:R24:R23:R22

値は上の順番でMSB-LSB順です。
戻り値が8bitの時はR25はクリアされます。

インラインアセンブラの例としては
string-avr.h
avr-libcのCtoASM.inc
iomacros.h
などがよいそうです。

●レジスタの使われ方

r0,r18-27,r30-r31 - scratch registers;
r2-r17,r28-r29 - registers are preserved across function calls;
r1 - alway zero.
GCC uses Y as frame pointer (pointer to local vars) if needed.
r0 is temporary register that can be trashed by anything(except interrupt handlers whitch save it).

r0レジスタのみアセンブラで影響なく変更できるそうです。

●その他の情報

・megaAVRを使うとき
ln -s libc-mega.a libgcc-mega.a

・アセンブラにプロセッサ名などを通す
avr-gcc -Wa,-gstabs -Wa,-mmcu=atmega103 entry.S -c


戻る