Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows &引用;“ABI挥发性”;在函数调用中被视为非易失性的寄存器_Windows_X86 64_Cpu Registers_Calling Convention_Abi - Fatal编程技术网

Windows &引用;“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

在Windows x64上,如果有其他细节,何时允许编译器将ABI标记为易失性的寄存器视为非易失性的寄存器?我有一个反汇编函数,
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