assembly 为什么x86 int寄存器的个数是8?

q43xntqr  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(89)

最近我开始学习x86汇编语言和CPU架构,注意到int寄存器的总数是8个,而x86-64是16个。
为什么?一定有什么原因。

wgxvkvu9

wgxvkvu91#

x86架构是从20世纪70年代早期的8008演变而来的,当时,内存字节和操作码空间都非常宝贵;只有3位被预留给(当时)A,B,C,D,E,F,(和IIRC)H和L寄存器,都是8位。(我记得那些机器编程有多痛苦,有多慢!你必须在内存读或写之前用内存地址加载H和L!)
从那时起,英特尔通过8080,8086,80186,80286,80386,80486架构发展了指令集,将寄存器扩展到16位和32位,但仍然使用相同的3位来选择寄存器。
直到AMD设计了一个64位版本的80486架构,第四个寄存器位才被添加,(因为现在存储器和因此操作码字节是廉价的)指令前缀字节。该前缀字节实质上将“8”加到由那些相同的3个传统寄存器位选择的寄存器号;这意味着“寄存器号”分散在整个指令中,这使得解码器很难看,但晶体管现在也很便宜。
16个寄存器的借口是“寄存器压力”。理想的CPU将在其寄存器中完成所有必要的运算,总是有足够的寄存器,所以有时不必溢出(稍后存储和重新加载)寄存器到内存中,为另一个计算腾出空间。测量(和经验)已经表明8个寄存器实际上不足以避免这种溢出,并且由于溢出触及存储器,它们大大降低了处理器的速度。我认为32是考虑(仔细测量)是绰绰有余的寄存器,但这将需要 2 位,和16是足够接近理想的是非常实用的。而且,AMD有一段时间能够使用他们的64位产品,和16个寄存器,而不仅仅是8,有效的高科技营销功能。
Intel发现他们在64位处理器战争中输给了AMD,试图生产自己的x86的64位扩展,但微软表示他们支持AMD指令集,并且不支持两种不同的x86 64位指令集。Intel放弃了,现在基本上拥有与AMD提供的相同的基本64位指令集。
你会发现这些CPU的最新版本有16和32(我认为)寄存器的向量寄存器集;操作码位现在便宜得多,指令提取速率令人难以置信。

jxct1oxe

jxct1oxe2#

我记得,1978年的8086有几万个晶体管,正因为如此,所有的指令都是微编码的。这意味着要将16位处理器的功能硬塞进等式中,需要做出大量的妥协。迄今为止最成功的16位处理器是数字设备公司的PDP-8086在16位寄存器中的4个寄存器中增加了8个字节的寄存器。
即使是地址转换也是微编码的。一条指令所需的平均周期为17。由于更多的晶体管(以及一个不完全微编码的地址转换单元),286将其降低到7,386降低到4.4,486降低到1.8。在此期间,时钟速度从5 MHz提高到100 MHz(在486 DX-3中)。
8086是为实时应用而设计的,更少的寄存器意味着更快的中断处理和任务切换。应该从它的历史背景中来看待它,而不是与今天的32位、32寄存器RISC处理器进行比较。
386是第一个支持32位的处理器,这是8086之后的十年。仍然只有八个通用寄存器具有16位子寄存器,其中四个具有8位子寄存器。
有一个点,8寄存器,32位架构不能通过扔在它更快的晶体管.或者,更确切地说,在规模上是改进8寄存器,32位解决方案使用更多的晶体管与扩展到16个寄存器的64位,每个和实施修订的指令集.后者赢了.

xdnvmnnf

xdnvmnnf3#

你可以很容易地解释它自己.要解决8寄存器,你只需要3位,这是什么是可用的汇编语言命令格式.由于64命令是两倍大,它有6位.在这里查看更多What is the size of each asm instruction?
因此,如果您的最短指令长度为1字节,则只有8位。因此,如果您需要将命令从一个寄存器移动到另一个寄存器,则需要将以下内容保留在8位中:
1.操作码
1.源地址
1.目的地地址
由于源地址和指定地址各占用3位,因此消耗了6位,并且您只有2位用于实际操作,总共4个操作,如移动,添加,子和交换。

相关问题