“ABI-volatile”寄存器在函数调用中被视为非易失性

时间:2013-04-25 20:01:13

标签: windows x86-64 cpu-registers calling-convention abi

在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

1 个答案:

答案 0 :(得分:2)

这些规则仅适用于对代码生成器一无所知的函数的调用。就像另一个后来链接的翻译单元中的函数一样。但是,如果类名相同,那么您显示的调用可能位于同一个翻译单元中。当代码生成器知道没有被修改时,R11不是易失性的。它可以知道。