-1
私はavr-as
アセンブラを使用しています。私はCファイルからアセンブリで定義された関数を使いたいと思う。 Cコードでアセンブリコードを使用するにはどうすればよいですか?Cコードからアセンブリ関数を呼び出す方法はありますか?
アセンブリソースが別のソースにある、つまりCソースにインライン展開されていないソリューションを探しています。
私はavr-as
アセンブラを使用しています。私はCファイルからアセンブリで定義された関数を使いたいと思う。 Cコードでアセンブリコードを使用するにはどうすればよいですか?Cコードからアセンブリ関数を呼び出す方法はありますか?
アセンブリソースが別のソースにある、つまりCソースにインライン展開されていないソリューションを探しています。
ここでは簡単な例を示します。 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
を定義します。 .global
がblinkPB5
をエクスポートするために使用されることに注意してください:
;; 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