2017-05-21 4 views
2

私はC言語でArduinoをプログラムすることができますが、私の現在のプロジェクト(小さなArduinoカーネル)では、アセンブリを学ぶためにいくつかのセクションでAssemblyを使用し、効率を向上させるためにAssemblyを使用します。Arduinoを組み立ててプログラミングしていますか?

__ASM __()のように使用できるものはありますか?私は本当にオンラインの人々を見つけることができただけで、似たような質問をしてCを学び、実際に質問に答えない人たちを説得しようとしています。

ありがとうございます!

+0

インラインアセンブリが先進的であるため、アセンブリ言語を最初に学習してから、実際には理由がある場合はインラインアセンブリを後で学習する必要があります。アセンブリ言語でAVRを(arduino上かどうかにかかわらず)絶対にプログラムすることができます。 –

+0

アセンブリでAVRをプログラミングするにはどうすればいいですか? C関数で使用される\ __ asm__タグのようなものはありますか? – LoganJamison

+0

それはインラインアセンブリーではありません... –

答えて

3

私は何歳も前に書いて、投稿しました。

.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となるでしょう。コンパイラがそれに準拠しているとすれば、例外があるので、ドキュメントを読んでも曖昧なものであっても、コンパイラが何をするかを見極めるのではなく、あなたが実験するまでわからないかもしれない用語を使用しています。

+0

あなたはそこにいろいろな例を見たいと思っています。AVRはあなたが学びたい最初のアセンブリではありません(最後ではなく、ハーバードアーキテクチャの性質上、msp430やアームの親指(cortex-m)彼らはすべて、インストラクションセットシミュレータを見つけたり、午後に書いたりすることができ、ビールツールのように自由に使うことができます。ボードを購入できるのは、通常、アルドゥイノのコストの10分の1程度です –

+0

幸いなことに、ATmega PDFの1つにAssemblyとCの両方にサンプルコードがあることがわかりました。私はそれが始めるのに適していると思います助けをありがとう、私はあなたのアドバイスを念頭に置いておきます! – LoganJamison

関連する問題