如何在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值