為什么在32位寄存器上的x86-64指令為全64位寄存器的上部為零?在x8664英特爾手冊之旅,我讀到也許最令人驚訝的事實是,像這樣的指令MOV EAX, EBX的上32位自動為零。RAX登記。同一來源引用的Intel文檔(3.4.1.1在手動基本架構中采用64位模式的通用寄存器)告訴我們:64位操作數在目標通用寄存器中生成64位結果.32位操作數在目標通用寄存器中生成32位結果,零擴展到64位結果.8位和16位操作數產生8位或16位結果.目的通用寄存器的上56位或48位(分別)不被操作修改。如果8位或16位操作的結果用于64位地址計算,則顯式地將寄存器擴展到64位。在x86-32和x86-64程序集中,16位指令如mov ax, bx不要表現出這種“奇怪”的行為,即eax的上端單詞是零的。因此:引入這種行為的原因是什么?乍一看,這似乎不合邏輯(但原因可能是我已經習慣了x86-32程序集的怪癖)。
2 回答

小唯快跑啊
TA貢獻1863條經驗 獲得超2個贊

RISEBY
TA貢獻1856條經驗 獲得超5個贊
MOV RAX, 42
MOV EAX, 42
- 2 回答
- 0 關注
- 1111 瀏覽
添加回答
舉報
0/150
提交
取消