私は何歳も前に書いて、投稿しました。
.device ATmega168
.equ DDRB = 0x04
.equ PORTB = 0x05
.org 0x0000
rjmp RESET
RESET:
ldi R16,0x20
out DDRB,R16
ldi R18,0x00
ldi R17,0x00
ldi R20,0x20
Loop:
ldi R19,0xE8
aloop:
inc R17
cpi R17,0x00
brne aloop
inc R18
cpi R18,0x00
brne aloop
inc R19
cpi R19,0x00
brne aloop
eor R16,R20
out PORTB, R16
rjmp Loop
私がアヴラを使用し、おそらくあなたはもちろんのavr_dudeを使用することができ、自分のArduinoローダー
blinker01.s.hex : blinker01.s
avra -fI blinker01.s
clean :
rm -f blinker01.s.*
を書きました。あなたは本当にあなたがそれら自身を宣言することができ、ポートを定義するヘッダファイルを必要といけない
.globl _start
_start:
rjmp RESET
RESET:
ldi R18,0x00
ldi R17,0x00
ldi R20,0x20
Loop:
ldi R19,0xE8
aloop:
inc R17
cpi R17,0x00
brne aloop
inc R18
cpi R18,0x00
brne aloop
inc R19
cpi R19,0x00
brne aloop
rjmp Loop
:少し異なるGNU何かを
。
MEMORY
{
rom : ORIGIN = 0x00000000, LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > rom
}
avr-as so.s -o so.o
avr-ld -T so.ld so.o -o so.elf
avr-objdump -D so.elf > so.list
avr-objcopy so.elf -O ihex so.hex
のapt-ましAVR-GCCを使用して(とbinutilsの)arduinoのサンドボックスで使用する可能性が同じツールを直接アクセスできる必要がありますが、私はサンドボックスを使用していけないので知りません。
EDIT
別のアプローチは、コンパイラが、その後行くんか見て、アセンブリの基礎に役立ち、限定されたが、あなたは、オブジェクトを追加する作業Cアプリケーションおよび環境で始まるので、ツールチェーンで成功する可能性が高いですそれをよく読んで:
unsigned short fun (unsigned short x, unsigned short y)
{
return(x+y+5);
}
avr-gcc -c -O2 so.c -o so.o
avr-objdump -D so.o
00000000 <fun>:
0: 6b 5f subi r22, 0xFB ; 251
2: 7f 4f sbci r23, 0xFF ; 255
4: 86 0f add r24, r22
6: 97 1f adc r25, r23
8: 08 95 ret
はそう
がso.s
.globl fun
fun:
subi r22, 0xFB ; 251
sbci r23, 0xFF ; 255
add r24, r22
adc r25, r23
ret
avr-as so.s -o so.o
avr-objdump -D so.o
00000000 <fun>:
0: 6b 5f subi r22, 0xFB ; 251
2: 7f 4f sbci r23, 0xFF ; 255
4: 86 0f add r24, r22
6: 97 1f adc r25, r23
8: 08 95 ret
0123を作成します
そして、Cで生成されたオブジェクトでリンクする代わりに、アセンブリで生成されたオブジェクトにリンクして、実験を通してあなたが把握できる呼び出し規約を学ばなければなりません。最初R24にR22、R24で戻り値で、この場合、2番目のパラメータで
unsigned char fun (unsigned char x, unsigned char y)
{
return(x+(y<<1));
}
00000000 <fun>:
0: 66 0f add r22, r22
2: 86 0f add r24, r22
4: 08 95 ret
。 22/23は短いもののような大きな項目の場合は最初のパラメータ、2番目の場合は24/25となるでしょう。コンパイラがそれに準拠しているとすれば、例外があるので、ドキュメントを読んでも曖昧なものであっても、コンパイラが何をするかを見極めるのではなく、あなたが実験するまでわからないかもしれない用語を使用しています。
インラインアセンブリが先進的であるため、アセンブリ言語を最初に学習してから、実際には理由がある場合はインラインアセンブリを後で学習する必要があります。アセンブリ言語でAVRを(arduino上かどうかにかかわらず)絶対にプログラムすることができます。 –
アセンブリでAVRをプログラミングするにはどうすればいいですか? C関数で使用される\ __ asm__タグのようなものはありますか? – LoganJamison
それはインラインアセンブリーではありません... –