2016-04-25 70 views
1

我是新裝配,我的問題是:x86 - 寄存器數量與保留位數

如果一臺機器有n個寄存器。在彙編指令中需要保留多少位來尋址n個寄存器中的每一個?

而功能分割可以減少多少位需要?

+2

這聽起來像作業,尤其是最後一部分。如果你無法弄清楚,你真的需要一張紙並坐下來思考。 – DarkDust

+2

請注意,x86 ISA不使用固定大小的指令。如果您對x86上的指令編碼的細節感興趣,請閱讀[英特爾軟件開發人員手冊](http://www.intel.com/content/www/us/en/processors/architectures-software-developer- manuals.html)(有關ModR/M字節的部分可能會對您特別感興趣)。 – Michael

+0

@DarkDust我只是跟着一本教科書,我想知道他們如何得到最少的位數。 – ethane

回答

4

對此沒有普遍的答案。顯然你需要在的大部分位上存儲寄存器的數量。所以如果你有12個寄存器,你需要4位(2^4 == 16)。但是一個指令集可能會以不同的方式處理某些寄存器(例如,具有隻隱式地指定特定寄存器的指令;請參見適用於x86的LOOP)。所以一個CPU可以有9個寄存器,但由於只能用專門的指令訪問,所以你只需要3位來尋址剩下的8個寄存器。另外,一些指令可以只允許某個寄存器子集,因此也可以減少需要對它們進行尋址的位(例如,一條指令只允許在0-3寄存器上操作)。

爲了使它更加複雜,有register windows這隻能使物理寄存器的一個子集可用於指令集。

+0

'loop'或'movsb'會是一個更好的例子。 'rep'不是一個獨立的指令,只能用於其他幾個insn。你說一些操作碼只能解決有限的寄存器是什麼意思?你是在談論沒有REX前綴的64位模式?我想不出一個例子,你有一個有限的寄存器選擇,它的編碼比正常的位少。 (除了16位尋址模式,並且'esp/rsp'不能作爲32/64位尋址模式下的索引寄存器。) –

+0

@PeterCordes:你說得對,'loop'就是一個更好的例子。已經更新了我的答案。關於有限的寄存器:我​​的答案是關於通用的(因此也是理論上的)CPU設計,儘管我隱約記得在8086和/或M68000中有這些限制的指令;試圖找到那些,似乎我錯了。順便說一句,x86系列也不使用註冊窗口。 – DarkDust

+1

你應該取出「一些x86操作碼這樣做」,因爲它是錯誤的。剩下的答案是好的(我不是downvoter),很顯然你不是在討論x86的其餘部分。如果您正在尋找示例,某些體系結構(ARM,IIRC,但我不確定)的指令使用了兩個寄存器,而第二條指令隱式地是顯式reg的奇數/偶數伴侶(切換低位,而不是加1)。對於特殊的寄存器:MIPS有32個GP寄存器加上HI和LO來保持全乘(32x32b => 64b)的結果,這是8 + 1的很好例子。 –