我使用avr-as
汇编程序。我想使用C文件中的程序集中定义的函数。如何在C代码中使用汇编代码?
我正在寻找解决方案,其中汇编源位于单独的源中,即未内联到C源。
答案 0 :(得分:2)
这是一个简单的例子,可以帮助您入门。假设你想在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