この記事は旧バージョン(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 |
インラインアセンブラの例としては
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