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