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

标签 c assembly linker avr

我使用avr-as 汇编器。我想使用 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/

相关文章:

c - 如何从动态字符串中删除换行符

Delphi + 汇编数组访问

c++ - 大型项目的 Visual Studio 2010 C++ 链接器性能

assembly - Cortex M0+ (SAMD21) 未执行待处理中断

linux - 为什么 x86 汇编函数的 GDB 断点设置在错误的地址?

regex - OCaml 中的正则表达式

xcode - 其他链接器标志列表

c++ - 添加两个无符号字符

c - 为什么要分两步进行位移?

c - 打印目录尺寸时尺寸错误(st_size)