feedforward 发表于 2023-1-5 11:22:31

gcc内嵌汇编

内联汇编格式:
__asm__("asm statements" : outputs : inputs : registers-modified);

__asm__("汇编语句"
                :输出寄存器
                :输入寄存器
                :会被修改的寄存器
                )汇编语句以":"分隔成四个部分,其中第一部分就是汇编代码本身,通常称为指令部,其格式和在汇编语言中使用的格式基本相同。指令部分是必须的,而其它部分则可以根据实际情况而省略,如果使用了后面的部分,而前面部分为空,也需要用“:”格开,相应部分内容为空.

举个例子:
asm(“add %2, %0” : “=r”(a) : “0”(a), “r”(b));“=r”(a) 为输出操作数,为%0,且与变量a绑定
“0”(a)为输入操作数,对“逻辑”输入操作数1指定数字规则”0”,表示这个逻辑操作数占用和操作数0一样的“位置”(占用同一个寄存器)
“r”(b)也是输入操作数,r表示寄存器变量。
以上内嵌汇编表示:a=a+b。


常用的constraints有以下几个(更多细节参见gcc手册):
m    内存操作数r    寄存器操作数i    立即数操作数(整数)f    浮点寄存器操作数F   立即数操作数(浮点)
gcc内联汇编操作符和修饰符:
操作符/修饰符    说明
=                被修饰的操作数只写
+                被修饰的操作数具有可读可写属性
&                被修饰的操作数只能作为输出


__asm__ __volatile__(
"cli":        ------>这个是汇编指令部分
:                ------->这个是输出部分,为空
:                -------->这个是输入部分,为空
"memory"        -------->这个是破坏描述部分
)

"__asm__" 表示后面的代码为内嵌汇编,“asm”是“__asm__”的别名。
“__volatile__” 表示编译器不要优化代码,后面的指令保留原样,“volatile”是它
的别名。 括号里面是汇编指令。
__asm__ __violate__ ("movl %1,%0" : "=r" (result) : "r" (input));
“movl %1,%0"是指令模板;”%0"和"%1"代表指令的操作数,称为占位符,内嵌汇编靠它们将C 语言表达式与指令操作数相对应。指令模板后面用小括号括起来的是C语言表达式,“result"和"input”,他们按照出现的顺序分 别与指令操作数"%0","%1"对应,操作数至多有10 个在每个操作数前面有一个用引号括起来的字符串,字符串的内容是对该操作数的限制或者说要求“result"前面的限制字符串是”=r",其中"="表示"result"是输出操作数,“r” 表示需要将"result"与某个通用寄存器相关联,先将操作数的值读入寄存器,然后在指令中使用相应寄存器,而不是"result"本身,当然指令执行 完后需要将寄存器中的值存入变量"result",从表面上看好像是指令直接对"result"进行操作,实际上GCC做了隐式处理
页: [1]
查看完整版本: gcc内嵌汇编