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

时间:2018-01-22 12:02:54

标签: c gcc inline-assembly

我们知道,如果我将 If IsError(WorksheetFunction.Match(SW, qrycolvaly, 0)) = True Then 设置为输入,那么我就不能将它包含在被破坏的寄存器列表中。所以我的问题是,修改汇编代码中的%eax的值是否合法,而在破坏列表中没有任何声明?

%eax

1 个答案:

答案 0 :(得分:4)

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

示例:

__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相同的寄存器。