在Windows上,什么时候允许编译器将x64标记为易失性的寄存器视为非易失性寄存器?我有一个反汇编函数,其中r11用于在函数调用后恢复另一个寄存器的值;根据this,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发布于 2013-04-26 06:14:22
这些规则仅适用于对代码生成器一无所知的函数进行调用时。就像稍后链接的另一个翻译单元中的函数。但是,如果类名是相同的,那么您显示的调用很可能位于相同的转换单元中。当代码生成器知道R11没有被修改时,它就不是易失性的。它可能会知道。
https://stackoverflow.com/questions/16223706
复制相似问题