2015-02-10 91 views
5

爲什麼沒有特定的寄存器來訪問寄存器的其他部分(16-32)?爲什麼EAX中的高16位不能通過名稱訪問(如AX,AH和AL)?

喜歡訪問寄存器的8位部分。

enter image description here

+0

好吧,我改變了我的問題...... – Alexandre 2015-02-10 11:03:26

+0

Rgister訪問器不存在這個特定的目的,因爲它們不存在訪問64位大小寄存器中的高32位。但是您可以經常移動寄存器內容,以便它們完全放入ax中,然後可以再次使用ax訪問器以及ah/al訪問。我總是這樣做。 – icbytes 2015-02-10 11:15:00

+0

如果你問爲什麼高16位沒有名稱 - 這是因爲歷史。要問的正確問題是爲什麼低16位有名稱 - 因爲8086.至於AH - 從8088天開始。英特爾處理器追蹤他們的血統到8088,這是一個8位處理器。 – sashoalm 2015-02-10 11:15:38

回答

3

當時的想法是寄存器擴展到32位,而不是創建一個機器與多達16個或8次位寄存器,因爲你已經受夠了那些。爲了保持編碼和硬件的簡單性,他們決定不直接訪問前16位。一切都需要付出代價。有趣的事實:64位擴展帶來的確帶來了r8 - r15,但是你不能直接訪問它們的前32位。

+1

這是歷史--8088,然後是8086和286,然後是386.那些是從這些初始版本的持久性。請參閱https://en.wikipedia.org/wiki/X86_instruction_listings#Original_8086.2F8088_instructions – sashoalm 2015-02-10 11:20:05

+1

@sashoalm:8088是8086之後的版本:它只是一個帶有8位數據總線的8086,但內部仍然是16位。 – ninjalj 2015-02-10 20:07:15

2

因爲沒有必要。大多數時候你使用完整的註冊表。像AX,AL這樣的低位寄存器主要用於加載/存儲數值,而不是用於計算。現在很難找到AH的用法。

允許訪問這些高端部件需要引入新的操作碼,這將污染已經很緊且混亂的x86操作碼空間。要爲這些指令找到一個免費的操作碼也不是一件容易的事情。此外,單獨訪問寄存器的不同部分將引入更復雜的依賴性,從而給指令調度員帶來更多壓力。這可能是爲什麼most x86_64 instructions zero the upper part of a 32 bit register而不是保存它的原因之一。

相關問題