英特尔8087芯片:浮点加法和减法
1980年,英特尔推出了8087芯片,使IBM PC和其他系统中的浮点运算速度大幅提高。虽然8087支持高级运算,如正切、平方根和对数,但本文重点关注基本算术运算:加法和减法。8087比8086处理器提供了显著的速度提升,使加法速度提高了近100倍,而复杂运算的速度提升则更为明显。在本文中,我将探讨8087的微代码和电路,以详细解释浮点加法和减法是如何实现的,包括对无限大和其他特殊值的众多特殊情况。为了研究8087的电路,我用凿子打开了一个芯片的外壳,并使用显微镜创建了下面的高分辨率图像。微代码ROM是芯片中央的一个大长方形区域,存储着控制芯片的1648条微指令。芯片的下半部分(红框)是数据通路,执行80位值的浮点计算。8087的数据通路特写,显示用于加法和减法的功能块。点击此图(或其他任何图)可以查看更大版本。放大数据通路显示了对于加法和减法重要的功能块。关键组件是位于中央的整数加法器。它从B寄存器接收一个参数,从临时寄存器或堆栈寄存器等组件接收另一个参数。加法器的输出存储在和寄存器中。移位器可以将值中的比特向左或向右移动。由于其电路允许值快速按任意数量的比特移动,因此移位器在芯片上占据了大量空间。浮点运算重度使用移位器来对齐值;前导零电路计算值左侧的零比特或字节的数量,以便将其移动。指数转换器处理指数,检测溢出和下溢。这些专用电路帮助8087实现了其高性能。大多数计算机使用整数作为其数字的基本表示。但许多应用需要使用带有小数部分的数字,例如1.23。此外,整数的范围非常有限:一个32位整数可以表示大约从-20亿到20亿的数字。为了解决这些问题,计算机通常实现浮点数,它提供范围极大的分数数。在大多数情况下,浮点数表示为符号 × 有效数 × 2 指数。有效数是形式为1.bbb…的二进制数:一个前导1,后跟二进制点(十进制点的二进制等价物)和其余的比特。在二进制数中,每个比特表示2的幂。对于小数部分,即二进制点后的部分,幂是负的:2^-1、2^-2,依此类推。因此,二进制数1.1是1 + 1/2,即十进制中的1.5。类似地,二进制数1.0011是1 + 1/8 + 1/16,即1.1875。指数允许数字突破有效数的有限范围。例如,1.1(二进制)× 2^8是304。通过更大的指数,浮点数可以覆盖巨大的范围;即使是32位短浮点数的范围也超过了10^-36到10^38。浮点加法和减法比整数运算更复杂。在数字可以相加(或相减)之前,它们的二进制点必须对齐,方法与十进制数的对齐相同。运算后,结果的指数必须调整,以规范有效数,使其以1比特开始。简单浮点加法的步骤。上面的图示说明了简单浮点加法:13.5 + 3.5。前两行显示了以指数和有效数表示的两个参数。两个参数都是规范化的,因此最左边的比特是1。在相加之前,第二个参数必须通过向右移动两个位置来对齐——使指数相等(在这种情况下,指数之间的差为二)。然后,使用对齐的有效数进行整数加法。在这种情况下,相加导致溢出,左侧多了一个比特。结果必须通过向右移位一位并将指数加1来规范化。浮点减法类似,但有更多复杂性。结果可以是正、负或零。结果可能比参数小几个数量级。下图显示了一个基本的减法,8 - 7.5。与加法一样,第二个参数向右移动,以使指数匹配(即二进制点对齐)。两个有效数使用整数减法相减。结果通过向左移位来规范化,以确保最高位是1。与加法的情况不同,规范化可能需要大的移位。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡