理论教育 编译器设计之路-浮点处理单元

编译器设计之路-浮点处理单元

时间:2023-11-04 理论教育 版权反馈
【摘要】:IA-32结构的处理器都提供了浮点处理单元。在i486之前的处理器中,FPU是独立于主处理器而存在的,通常称为“协处理器”。FPU共有8个80位的浮点数据寄存器,分别命名为RO、Rl、…、数据指针、标记寄存器、控制图9-2 FPU寄存器堆栈1.浮点数据寄存器在i386处理器结构中,FPU是一个模拟的栈式机。随着TOP的变化,处理器将自动改变寄存器的别名。2)执行浮点运算指令。3)将运算结果存储至目标单元。例9-2浮点运算实例,编程实现计算表达式+。

编译器设计之路-浮点处理单元

IA-32结构的处理器都提供了浮点处理单元(FPU)。在i486之前的处理器中,FPU是独立于主处理器而存在的,通常称为“协处理器”。在i486之后,由于主处理器运算性能的提高,FPU也被集成到了主处理器中。不过,这对于程序员似乎是透明的。事实上,直到今天,从应用的角度来说,FPU仍然是以一个逻辑整体的形式存在的。由于8086没有FPU,因此,关于FPU的原理及其应用,国内汇编语言教材很少涉及。在此,笔者有必要稍作详解。

FPU共有8个80位的浮点数据寄存器,分别命名为RO、Rl、…、R7。不过,从程序员的角度来看,这8个寄存器的逻辑标识为ST(O)、ST(1)、ST(2)、ST(3)、ST(4)、ST(5)、ST(6)、ST(7)。两种命名没有必然的联系,这是非常奇怪的,笔者稍后解释。当然,FPU还拥寄存有器独、立状的态指寄令存指器针。、数据指针、标记寄存器、控制

978-7-111-32164-4-Chapter09-7.jpg

图9-2 FPU寄存器堆栈

1.浮点数据寄存器

在i386处理器结构中,FPU是一个模拟的栈式机。与通用寄存器不同,浮点数据寄存器是以循环堆栈的形式组织的,如图9-2所示。图中TOP指向的是栈顶寄存器,它占用了状态寄存器中的3位。由于TOP栈顶可能是任意的,因此,要直接访问TOP指向的物理寄存器就必须经过变址寻址,同时,还要考虑偏移的取模处理。为了便于程序员访问,处理器将根据TOP的当前位置,为每个寄存器分配一个别名。将TOP指向的栈顶寄存器命名为ST(O),然后,沿栈顶向栈底的方向,依次标识为ST(1)-ST(7)。随着TOP的变化,处理器将自动改变寄存器的别名。

2.浮点运算的过程

众所周知,浮点数通常是依据IEEE 754格式存储的。关于IEEE 754格式的规范,笔者就不再详述了。浮点运算的过程大致分为三步:

1)将操作数装入浮点数据寄存器堆栈。

2)执行浮点运算指令。根据指令所需的操作数个数,从堆栈获取操作数,并将运算结果再次压入堆栈。

3)将运算结果存储至目标单元。

值得注意的是,在IA-32结构中,FPU与主CPU之间的操作数传递只能借助内存进行,而不能直接从主CPU的寄存器传递给FPU。

例9-2浮点运算实例,编程实现计算表达式(8.12×2.3)+(12.3×9.2)。

978-7-111-32164-4-Chapter09-8.jpg

3.FPU指令集

表9-1是数据传递操作指令列表。(www.daowen.com)

表9-1 数据传递操作指令列表

978-7-111-32164-4-Chapter09-9.jpg

(续)

978-7-111-32164-4-Chapter09-10.jpg

表9-2是数据比较指令列表。

表9-2 数据比较指令列表

978-7-111-32164-4-Chapter09-11.jpg

表9-3是数据运算指令列表。

表9-3 数据运算指令列表

978-7-111-32164-4-Chapter09-12.jpg

(续)

978-7-111-32164-4-Chapter09-13.jpg

(续)

978-7-111-32164-4-Chapter09-14.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈