繁体   English   中英

我可以在gcc内联汇编中修改输入操作数吗

[英]Can I modify input operands in gcc inline assembly

我们知道,如果我将%eax设置为输入,则无法将其包含在受破坏的寄存器列表中。 所以我的问题是,在汇编列表中不声明任何内容而修改汇编代码中%eax的值是否合法?

__asm__ __volatile__("inc %0" :: "a"(num) : "%eax"); // illegal
__asm__ __volatile__("inc %0" :: "a"(num));       // Can I modify %eax?

否,如果汇编代码更改了输入寄存器,则还必须通过在约束中使用“ +”而不是“ =”将其列为输出寄存器或输入输出寄存器。

例子:

__asm__ __volatile__("..." : "+r"(num));
__asm__ __volatile__("..." : "=a"(dummy) : "a"(num));
__asm__ __volatile__("..." : "=r"(dummy) : "0"(num));

第一个示例将num指定为输入和输出。 这将覆盖num的先前值,如果操作数被破坏而被设置为有用的值,则这可能是不希望的。

第二个示例将eax明确用于输入和输出。 它将输出定向到dummy变量,以免破坏实际的输入变量num

第三个示例使用伪输出,以避免修改num ,还避免显式指定eax,从而允许编译器选择要使用的寄存器。 "0"约束条件告诉编译器对此输入操作数使用与操作数0相同的寄存器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM