2013-04-25 42 views
1

在Windows x64上,如果編譯器允許將ABI標記爲非易失性的寄存器作爲非易失性給定一些其他見解?我有一個反彙編功能,其中r11用於在函數調用後恢復另一個寄存器的值;當根據this時,r11本身被認爲是跨函數調用的volatile。通過函數調用將「ABI-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 

回答

2

這些規則只適用。就像後面另一個翻譯單元中的函數一樣。但是您顯示的電話可能位於同一翻譯單元中,因爲類名相同。當代碼生成器知道它未被修改時,R11不易變。它可以知道。

+0

他們在同一翻譯單位。我很習慣處理JIT編譯的代碼,所以這些假設本身就是危險的。我想我需要開始提醒自己,靜態編譯不能太偏執。謝謝。 – shroudednight 2013-04-26 14:53:37

相關問題