亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在32位寄存器上的x86-64指令為全64位寄存器的上部為零?

為什么在32位寄存器上的x86-64指令為全64位寄存器的上部為零?

慕慕森 2019-06-03 17:22:40
為什么在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個贊

我不是AMD,也不是他們的代言人,但我會用同樣的方式去做。因為對上半部分進行零化并不會造成對前一個值的依賴,所以CPU必須等待。如果沒有這樣做,注冊重命名機制將基本上失敗。這樣,您就可以在64位模式下編寫快速32位代碼,而不必始終顯式地中斷依賴關系。如果沒有這種行為,64位模式下的每一個32位指令都必須等待以前發生的事情,盡管這個高部分幾乎不會被使用。

16位指令的行為是奇怪的。依賴瘋狂是現在避免16位指令的原因之一。


查看完整回答
反對 回復 2019-06-03
?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

它只需在指令和指令集中節省空間。您可以使用現有(32位)指令將小的即時值移動到64位寄存器中。

它還使您不必對8字節值進行編碼。MOV RAX, 42,何時MOV EAX, 42可以重復使用。

這種優化對于8位和16位操作(因為它們更小)不那么重要,而更改規則也會破壞舊代碼。


查看完整回答
反對 回復 2019-06-03
  • 2 回答
  • 0 關注
  • 1111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號