在 VS2019 中運行下面的代碼,令我驚訝的是暫存器 EAX 沒有用指令清零xor eax, eax。
_text SEGMENT
.486
.model flat,stdcall
.stack 4096
.code
main PROC
xor eax, eax
ret
main ENDP
_text ENDS
END
PS:我期待指令后 EAX 暫存器為零xor eax, eax。使用ret指令中的斷點除錯代碼,我可以在“暫存器”視窗中看到只有 AX 為零。EAX 中的第 16-31 位沒有任何變化。在 x64 中,指令xor eax, eax正確執行,按預期將整個 RAX 暫存器清零。
uj5u.com熱心網友回復:
根據您的評論,該SEGMENT指令似乎以某種方式使匯編程式相信它正在匯編以 16 位模式運行的代碼。
在 16 位模式下,在 32 位暫存器上操作的指令eax需要一個66運算元大小前綴,因此匯編程式發出66 33 C0. 但是,該程式實際上是在 32 位模式下運行的,其中66運算元大小前綴的含義是相反的:32 位運算元是默認值并66選擇 16 位運算元。因此,當程式運行時,指令執行為xor ax, ax并且沒有將eax.
你說洗掉SEGMENT指令修復了它。我不知道它為什么會產生這種效果,但 32 位 MASM 程式的其他示例無論如何都不包含此指令,因此它可能根本不應該存在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/313735.html
下一篇:Pep8數分解
