我使用汇编程序。我要使用在程序集中从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

关于c - 如何从C代码调用汇编函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37177891/

10-11 22:42
查看更多