Windows &引用;“ABI挥发性”;在函数调用中被视为非易失性的寄存器
在Windows x64上,如果有其他细节,何时允许编译器将ABI标记为易失性的寄存器视为非易失性的寄存器?我有一个反汇编函数,Windows &引用;“ABI挥发性”;在函数调用中被视为非易失性的寄存器,windows,x86-64,cpu-registers,calling-convention,abi,Windows,X86 64,Cpu Registers,Calling Convention,Abi,在Windows x64上,如果有其他细节,何时允许编译器将ABI标记为易失性的寄存器视为非易失性的寄存器?我有一个反汇编函数,r11用于在函数调用后恢复另一个寄存器的值;根据r11本身被认为是跨函数调用的易失性 例如(从反汇编函数): 及 这些规则仅在对代码生成器一无所知的函数进行调用时适用。类似于另一个翻译单元中稍后链接的函数。但是,如果类名相同,那么显示的调用很可能位于同一个翻译单元中。当代码生成器知道它没有被修改时,R11不是易失性的。它可能知道。它们在同一个翻译单元中。我太习惯于处理J
r11
用于在函数调用后恢复另一个寄存器的值;根据r11本身被认为是跨函数调用的易失性
例如(从反汇编函数):
及
这些规则仅在对代码生成器一无所知的函数进行调用时适用。类似于另一个翻译单元中稍后链接的函数。但是,如果类名相同,那么显示的调用很可能位于同一个翻译单元中。当代码生成器知道它没有被修改时,R11不是易失性的。它可能知道。它们在同一个翻译单元中。我太习惯于处理JIT编译的代码了,这样的假设看起来有内在的危险性。我想我需要开始提醒自己,静态编译不能如此偏执。谢谢
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