回答
對此沒有普遍的答案。顯然你需要在的大部分位上存儲寄存器的數量。所以如果你有12個寄存器,你需要4位(2^4 == 16)。但是一個指令集可能會以不同的方式處理某些寄存器(例如,具有隻隱式地指定特定寄存器的指令;請參見適用於x86的LOOP
)。所以一個CPU可以有9個寄存器,但由於只能用專門的指令訪問,所以你只需要3位來尋址剩下的8個寄存器。另外,一些指令可以只允許某個寄存器子集,因此也可以減少需要對它們進行尋址的位(例如,一條指令只允許在0-3寄存器上操作)。
爲了使它更加複雜,有register windows這隻能使物理寄存器的一個子集可用於指令集。
'loop'或'movsb'會是一個更好的例子。 'rep'不是一個獨立的指令,只能用於其他幾個insn。你說一些操作碼只能解決有限的寄存器是什麼意思?你是在談論沒有REX前綴的64位模式?我想不出一個例子,你有一個有限的寄存器選擇,它的編碼比正常的位少。 (除了16位尋址模式,並且'esp/rsp'不能作爲32/64位尋址模式下的索引寄存器。) –
@PeterCordes:你說得對,'loop'就是一個更好的例子。已經更新了我的答案。關於有限的寄存器:我的答案是關於通用的(因此也是理論上的)CPU設計,儘管我隱約記得在8086和/或M68000中有這些限制的指令;試圖找到那些,似乎我錯了。順便說一句,x86系列也不使用註冊窗口。 – DarkDust
你應該取出「一些x86操作碼這樣做」,因爲它是錯誤的。剩下的答案是好的(我不是downvoter),很顯然你不是在討論x86的其餘部分。如果您正在尋找示例,某些體系結構(ARM,IIRC,但我不確定)的指令使用了兩個寄存器,而第二條指令隱式地是顯式reg的奇數/偶數伴侶(切換低位,而不是加1)。對於特殊的寄存器:MIPS有32個GP寄存器加上HI和LO來保持全乘(32x32b => 64b)的結果,這是8 + 1的很好例子。 –
- 1. 通過Linux x86-64函數調用保留了哪些寄存器
- 2. x86中的額外寄存器64位
- 3. 將兩個x86 32位寄存器存儲到128位xmm寄存器中
- 4. 載入小的數字爲64位x86寄存器
- 5. 的x86寄存器值
- 6. GCC不在函數調用中保存/恢復保留的寄存器
- 7. x86寄存器名稱,尋址模式,位移和存儲器
- 8. 如何在LLVM中保留寄存器?
- 9. x86 cmp寄存器和內存 - 中間數據保存在哪裏?
- 10. 爲什麼SSE指令保留YMM寄存器的高128位?
- 11. 32位寄存器作爲8位寄存器
- 12. x86彙編,ROR旋轉,從寄存器或內存計數
- 13. 32位寄存器將64位分成兩個32位寄存器
- 14. 如何將XMM 128位寄存器分成兩個64位整數寄存器?
- 15. 在保護模式x86下可以訪問16位寄存器嗎?
- 16. x86彙編打印寄存器ascii
- 17. 理解寄存器的問題x86
- 18. x86部分寄存器使用情況
- 19. 通過LLVM IR控制x86寄存器?
- 20. x86彙編寄存器地址
- 21. 與寄存器
- 22. 澄清32位寄存器的子部分x86
- 23. 英特爾x86 32位寄存器混淆
- 24. GDB寄存器與處理器寄存器不同嗎?
- 25. 哪些寄存器在函數中可以安全使用(x86)
- 26. 在x86-64溢出的gcc參數寄存器
- 27. 位屏蔽位寄存器
- 28. MIPS中浮點寄存器的數量
- 29. 每個線程的寄存器數量
- 30. Smali:增加寄存器的數量
這聽起來像作業,尤其是最後一部分。如果你無法弄清楚,你真的需要一張紙並坐下來思考。 – DarkDust
請注意,x86 ISA不使用固定大小的指令。如果您對x86上的指令編碼的細節感興趣,請閱讀[英特爾軟件開發人員手冊](http://www.intel.com/content/www/us/en/processors/architectures-software-developer- manuals.html)(有關ModR/M字節的部分可能會對您特別感興趣)。 – Michael
@DarkDust我只是跟着一本教科書,我想知道他們如何得到最少的位數。 – ethane