gpt4 book ai didi

c - gcc 是否支持嵌入式汇编语法?

转载 作者:行者123 更新时间:2023-12-02 03:21:10 26 4
gpt4 key购买 nike

William Hohl 的 ARM 汇编语言一书讨论了嵌入式汇编程序语法。可以在 here 上找到它的示例在 ARM 引用手册上:

#include <stdio.h>
__asm void my_strcpy(const char *src, char *dst)
{
loop
LDRB r2, [r0], #1
STRB r2, [r1], #1
CMP r2, #0
BNE loop
BX lr
}

当我用谷歌搜索“gcc 嵌入式汇编程序”语法时,我只得到以下 results . gcc 是否只支持它所谓的“extended assembly syntax”? ?”

 asm [volatile] ( AssemblerTemplate
: OutputOperands
[ : InputOperands
[ : Clobbers ] ])

最佳答案

不。GCC 支持嵌入的汇编函数,如您的示例中所示。你将不得不使用例如一个 KEIL 编译器。

GCC 支持的两种形式的内联汇编是“简单的”(这只是 asm 关键字后跟花括号的变体之一)和更有用的“扩展的” "形式允许您以非常灵活和高效的方式将输入和输出变量映射到寄存器或寄存器类。您可以编写几乎与寄存器无关的程序集,该程序集可以正常工作并充分利用编译器的低级优化能力(它显然不能进行高级优化,这要求有点过分了!)。
不幸的是,语法有点……一开始不直观。

为了获得与嵌入式程序集 my_strcpy 函数相同的效果,您必须编写一个包含扩展程序集 block 的普通函数,并将函数的参数映射到输入(并且不要不要忘记破坏内存)。

请注意,GCC 内联汇编有一些额外的怪癖,这可能会让您大吃一惊。首先,它使用 AT&T 表示法,然后您必须显式添加 \n 到每一行以防止汇编程序报错(或者 \n\t 如果您打算检查中间文件并关心可读输出)。
第一个怪癖(AT&T 符号)实际上是一个好处,因为它比 Intel 符号直观得多,您只需要首先了解它。另一方面,显式添加转义换行符的需要是……废话。幸运的是,您真的不需要经常使用汇编(如果有的话)。

关于c - gcc 是否支持嵌入式汇编语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33299318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com