如何在C代码中使用内联汇编之asm操作数的约束

asm操作数的约束
约束
可以说明操作数是否在寄存器中
可以说明寄存器的类型
可以说明操作数是否可以作为内存引用
可以说明操作数地址的种类
可以说明操作数是否是立即数,
可以说明操作数可能具有哪些值。
也可以说明要求两个操作数匹配。
内联asm的操作数中不允许有副作用
如果使用了’ < ‘或’ > '约束,就有可能有副作用,因为不能保证副作用在可以更新寻址寄存器的指令中只发生一次。

• Simple Constraints: Basic use of constraints.
• Multi-Alternative: When an insn has two alternative constraint-patterns.
• Modifiers: More precise control over effects of constraints.
• Machine Constraints: Special constraints for some particular machines.

简单的约束
https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Simple-Constraints.html#Simple-Constraints
空格
空白字符将被忽略
‘m’
内存操作数是允许的,通常机器支持任何类型的地址。
注意,用于通用内存约束的字母可以使用TARGET_MEM_CONSTRAINT宏的后端重新定义
‘o’
‘V’
‘<’
‘>’
‘r’
如果寄存器操作数位于通用寄存器中,则允许它。
‘i’
‘n’
‘I’,‘J’,‘k’,… ‘P’
‘E’
‘F’
‘G’,‘H’
‘s’
‘g’
‘X’
‘0’,‘1’,‘2’,… ‘9’
‘p’
其他字母

多个可选约束
https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Multi-Alternative.html#Multi-Alternative
有时,一条指令有多个可选操作数集。例如,在68000上,逻辑或指令可以将寄存器或一个立即值组合到内存中,也可以将任何一种操作数组合到寄存器中;但是它不能将一个内存位置合并到另一个内存位置。
这些约束表示为多个备选项。一种替代方法可以用每个操作数的一系列字母来描述。
操作数的总体约束由第一个备选项的操作数的字母(逗号)和第二个备选项的操作数的字母(逗号)构成,以此类推,直到最后一个备选项。一条指令的所有操作数必须具有相同数量的替代项。

约束的修饰符字符
https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Modifiers.html#Modifiers
‘=’
表示此操作数是由这条指令写入的:以前的值将被丢弃,并由新数据替换。
‘+’
表示该操作数由指令读取和写入。
当编译器修复操作数以满足约束时,它需要知道哪些操作数由指令读取,哪些操作数由指令编写
’ = ‘标识仅写入的操作数;’ + ‘标识一个既可读又可写的操作数;
如果在约束中指定’ = ‘或’ + ‘,则将其放在约束字符串的第一个字符中。
‘&’
表示(在特定的替代方法中)这个操作数是一个earlyclobber操作数,它是在使用输入操作数完成指令之前编写的。
在此之前,这个操作数不能存在于指令读取的寄存器中,也不能作为任何内存地址的一部分。
‘%’
这意味着编译器可以交换两个操作数,如果这是使所有操作数都符合约束的最便宜的方法。’ % ‘适用于所有替代,并且必须作为约束中的第一个字符出现。只有只读操作数可以使用’ % '。

特定于机器的约束

https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Machine-Constraints.html#Machine-Constraints

猜你喜欢

转载自blog.csdn.net/wzc18743083828/article/details/100544095