在Windows x64上,什么时候允许编译器将ABI标记为非易失性的寄存器给出一些额外的见解?我有一个反汇编函数,其中r11
用于在函数调用后恢复另一个寄存器的值;根据{{3}},r11
本身在函数调用中被认为是不稳定的。
例如(来自反汇编函数):
myLibrary!MyClass::currentMemberFunction+0x18:
call myLibrary!MyClass::calledMemberFunction
cmp dword ptr [rsp+68h],0
mov rdi,rax
je myLibrary!MyClass::currentMemberFunction+0x58
test rbx,rbx
mov rcx,r11
je myLibrary!MyClass::currentMemberFunction+0x60
和
myLibrary!MyClass::currentMemberFunction+0x2f:
call myLibrary!MyClass::anotherCalledMemberFunction
mov rdx,rdi
mov rcx,r11
答案 0 :(得分:2)
这些规则仅适用于对代码生成器一无所知的函数的调用。就像另一个后来链接的翻译单元中的函数一样。但是,如果类名相同,那么您显示的调用可能位于同一个翻译单元中。当代码生成器知道没有被修改时,R11不是易失性的。它可以知道。