我想清除GNU汇编中的高位32位x86_64 64位通用寄存器(我使用的是GNU汇编器2.25.2)。输出到EAX寄存器的操作清除RAX寄存器的高32位。
mov eax, eax
可以使用宏来为所有x86_64 64位通用寄存器进行泛化。
.macro ClearUpper32bits register64
mov register32, register32
.endm
问题是如何获得64位寄存器名称的相应32位寄存器名称。一种解决方案是根据每个寄存器名称在宏中切换操作数。
.macro ClearUpper32bits register64
.if (\register64 == rax)
mov eax, eax
.elseif (\register64 == rbx)
mov ebx, ebx
(Repeat the two lines for RCX ... R14 registers)
.elseif (\register64 == r15)
mov r15d, r15d
.endif
.endm
这是多余的,在复制行时很容易出错。有没有比这个宏更好的方法?