1

在 Windows x64 上,何时允许编译器将 ABI 标记为易失性的寄存器视为非易失性,并给出一些额外的见解?我有一个反汇编函数,r11用于在函数调用后恢复另一个寄存器的值;当根据this时,r11它本身被认为是跨函数调用的 volatile 。

例如(来自反汇编函数):

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
4

1 回答 1

2

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

于 2013-04-25T22:14:21.800 回答