1

Windows x64 では、ABI が揮発性としてマークするレジスタを不揮発性として扱うことをコンパイラが許可されるのはいつですか? 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
4

1 に答える 1

2

これらの規則は、コード ジェネレーターが何も認識していない関数が呼び出された場合にのみ適用されます。後でリンクされる別の翻訳単位の関数のように。ただし、クラス名が同じであれば、表示する呼び出しは同じ翻訳単位にある可能性があります。コード ジェネレーターが R11 が変更されていないことを認識している場合、R11 は揮発性はありません。それは知っているかもしれません。

于 2013-04-25T22:14:21.800 に答える