2016-05-12 24 views
-1

私はavr-asアセンブラを使用しています。私はCファイルからアセンブリで定義された関数を使いたいと思う。 Cコードでアセンブリコードを使用するにはどうすればよいですか?Cコードからアセンブリ関数を呼び出す方法はありますか?

アセンブリソースが別のソースにある、つまりCソースにインライン展開されていないソリューションを探しています。

答えて

0

ここでは簡単な例を示します。 Cでmainループを書きたいとし、アセンブリで書かれた関数を呼び出してPB5を点滅させたいとします。

C源が宣言および使用(ただし、定義されていない)blinkPB5

/* main.c */ 
#include <avr/io.h> 
#include <util/delay.h> 

extern void blinkPB5(); 

int main() 
{ 
    DDRB |= _BV(DDB0); 

    for (;;) 
    { 
     blinkPB5(); 
     _delay_ms(500); 
    } 
} 

アセンブリソースはblinkPB5を定義します。 .globalblinkPB5をエクスポートするために使用されることに注意してください:

;; blinkPB5.s 
.global blinkPB5 

.section .text 

blinkPB5:  
     ldi r25, 0x01 
     in r24, 0x05 
     eor r24, r25 
    out 0x05, r24 
     ret 

.end   

両者は別々にコンパイルすることができる。

avr-gcc -c -O3 -w -mmcu=atmega328p -DF_CPU=1000000L main.c -o _build/main.c.o 
avr-gcc -c -O3 -w -mmcu=atmega328p -DF_CPU=1000000L blinkPB5.s -o _build/blinkPB5.s.o 

は、次に一緒に連結され、そして.hex画像にフォーマット:

avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p _build/main.c.o _build/blinkPB5.s.o -o _build/image.elf 
avr-objcopy -Oihex -R.eeprom _build/image.elf _build/image.hex 
関連する問題