如何从C代码中调用汇编函数?

3
我使用avr-as汇编器。我想从C文件中使用在汇编中定义的函数。如何在C代码中使用汇编代码?
我正在寻找将汇编源代码放在单独的源文件中的解决方案,即不是内联到C源文件中。
1个回答

3
这里有一个简单的例子供您开始。假设您想在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接