Assembly x86-寄存器数与保留位数

Assembly x86-寄存器数与保留位数,assembly,x86,machine-instruction,Assembly,X86,Machine Instruction,我是大会新手,我的问题是: 例如,如果一台机器有n个寄存器。汇编指令中需要保留多少位来寻址n个寄存器中的每个寄存器? 功能拆分可以减少多少所需的位?对此没有通用的答案。显然,您最多需要足够的位来存储寄存器的数量。因此,如果有12个寄存器,则需要4位2^4==16 但指令集可以以不同的方式处理某些寄存器,例如,指令只隐式寻址特定寄存器;请参阅x86的循环。因此,一个CPU可以有9个寄存器,但由于一个寄存器只能用专门的指令访问,所以只需要3位来寻址其余的8个寄存器。此外,一些指令只允许寄存器的某个子

我是大会新手,我的问题是:

例如,如果一台机器有n个寄存器。汇编指令中需要保留多少位来寻址n个寄存器中的每个寄存器?
功能拆分可以减少多少所需的位?

对此没有通用的答案。显然,您最多需要足够的位来存储寄存器的数量。因此,如果有12个寄存器,则需要4位2^4==16

但指令集可以以不同的方式处理某些寄存器,例如,指令只隐式寻址特定寄存器;请参阅x86的循环。因此,一个CPU可以有9个寄存器,但由于一个寄存器只能用专门的指令访问,所以只需要3位来寻址其余的8个寄存器。此外,一些指令只允许寄存器的某个子集,因此也减少了寻址它们所需的位数,例如,一条指令只允许对寄存器0–3进行操作


更复杂的是,有一种方法只能使物理寄存器的一个子集可用于指令集。

对此没有通用的答案。显然,您最多需要足够的位来存储寄存器的数量。因此,如果有12个寄存器,则需要4位2^4==16

但指令集可以以不同的方式处理某些寄存器,例如,指令只隐式寻址特定寄存器;请参阅x86的循环。因此,一个CPU可以有9个寄存器,但由于一个寄存器只能用专门的指令访问,所以只需要3位来寻址其余的8个寄存器。此外,一些指令只允许寄存器的某个子集,因此也减少了寻址它们所需的位数,例如,一条指令只允许对寄存器0–3进行操作


更为复杂的是,还有一种方法只能将物理寄存器的一个子集提供给指令集。

这听起来像是家庭作业,尤其是最后一部分。如果你想不出那一条,你真的需要一张纸,坐下来思考。注意x86 ISA不使用固定大小的指令。如果您对x86上的指令编码的细节感兴趣,请阅读有关ModR/M字节的部分,您可能会特别感兴趣。@DarkDust我只是在学习一本教科书,我想知道它们是如何获得所需的最少位数的。这听起来像是家庭作业,尤其是最后一部分。如果你想不出那一条,你真的需要一张纸,坐下来思考。注意x86 ISA不使用固定大小的指令。如果您对x86上的指令编码的细节感兴趣,请阅读有关ModR/M字节的部分,您可能会特别感兴趣。@DarkDust我只是在学习一本教科书,我想知道它们是如何获得所需的最少位数的。loop或movsb是一个更好的例子。rep不是独立的指令,只能应用于少数其他INSN。你说某些操作码只能寻址有限的寄存器是什么意思?你说的是没有REX前缀的64位模式吗?我想不出一个例子,你有一个有限的选择寄存器的编码比正常少位。除了16位寻址模式之外,esp/rsp不能在32/64位寻址模式下作为索引寄存器。@PeterCordes:你说得对,循环是一个更好的例子。我已经更新了我的答案。关于有限的寄存器:我的答案是关于通用的,因此也是理论上的CPU设计,尽管我隐约记得在8086和/或M68000中有这样的限制指令;试图找到那些,似乎我错了。顺便说一句,x86系列也不使用注册窗口。您应该拿出一些x86操作码来执行此操作,因为这是错误的。你剩下的答案是好的,我不是落选者,很明显,你在剩下的部分没有谈论x86。如果您正在寻找示例,一些架构ARM,IIRC,但我不确定是否有使用两个寄存器的指令,第二条指令隐式地是显式reg的奇偶伙伴切换低位,而不是添加1。对于特殊的寄存器:MIPS有32个GP寄存器加上HI和LO来保存全乘法的结果32x32b=>64b,对于8+1.loop或movsb是一个更好的例子。rep不是独立的指令,只能应用于少数其他INSN。你说某些操作码只能寻址有限的寄存器是什么意思?你说的是没有REX前缀的64位模式吗?我想不出一个例子,你有一个有限的选择寄存器的编码比正常少位。除了16位寻址模式之外,esp/rsp不能在32/64位寻址模式下作为索引寄存器。@PeterCordes:你说得对,循环是一个更好的例子。我已经更新了我的答案。关于有限的寄存器:我的答案是关于泛型的,因此也是理论上的CPU de
迹象,尽管我隐约记得在8086和/或M68000中有这样的限制说明;试图找到那些,似乎我错了。顺便说一句,x86系列也不使用注册窗口。您应该拿出一些x86操作码来执行此操作,因为这是错误的。你剩下的答案是好的,我不是落选者,很明显,你在剩下的部分没有谈论x86。如果您正在寻找示例,一些架构ARM,IIRC,但我不确定是否有使用两个寄存器的指令,第二条指令隐式地是显式reg的奇偶伙伴切换低位,而不是添加1。对于特殊的寄存器:MIPS有32个GP寄存器加上HI和LO来保存全乘法的结果32x32b=>64b,这是8+1的好例子。