- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Assembly 数字协处理器
Assembly 数字协处理器
硬件
早期的Intel处理器并没有提供⽀持浮点操作的硬件。这并不意味着它们不可以执⾏浮
点操作。它 表⽰它们需要通过由许多⾮浮点指令组成的程序来执⾏这些操作。对
于早期的系统,Intel提供了⼀⽚额外的称为数学协处理器的芯⽚。相⽐于使⽤软件程
序,数学协处理器拥有能快速执⾏许多浮点操作的机器指令(在早期的处理器上,⾄少
快10倍 !) 。8086/8088的协处理器为8087 。80286的协处理器为80287 ,80386的为
80387 。80486DX处理器将数学协处理器内置到80486 中了。从Pentium开始,所有⽣产
的80x86
处理器都内置数学协处理器;但是,它依然被规划成好像它是⼀个分离的单元。即使
是早期没有协处理器的系统都可以安装⼀个模拟数学协处理器的软件。当⼀个程序执
⾏了⼀条协处理器指令时,这个模拟软件包将⾃动激活并执⾏⼀个软件程序来得到与
真实协处理器⼀样的结果(虽然,毫⽆疑问,会⽐较慢) 。
数学协处理器有⼋个浮点数寄存器。每个寄存器储存着80位的数据。在这些寄存器
中,浮点数总是储存成80位的扩展精度。这些寄存器称为ST0 ,ST 1,ST2 ,...ST7 。
浮点寄存器与主CPU 中的整形寄存器的使⽤⽅法是不同的。浮点寄存器被当作⼀个堆
栈来管理。回想⼀下堆栈是⼀个后进先出(LIFO)队列。ST0总是指向栈顶的值。所有
新的数都被加⼊到栈顶中。已经存在的数被压⼊到堆栈中,为了为新来的数提供空
间。
在数学协处理器中同样有⼀个状态寄存器。它有⼏个标志位。只有4个⽤来⽐较的标
志位将会提到: 。这些位的使⽤将在以后讨论。
指令
为了很容易地将普通的CPU指令和协处理器指令区分开来,所有的协处理器助词符都
是以F开头。
导⼊和储存
⽤来将数据导⼊到协处理器寄存器栈顶的指令有⼏条:
将堆栈中的数据储存到内存的指令同样也有⼏条。其中有⼏条指令当它们储存好⼀个
数后,会将这个数从栈中弹出(也就是删除) 。
加法和减法
每⼀条加法指令都是计算ST0和另⼀个操作数的和。结果总是储存到⼀个协处理器寄
存器中。
减法指令是加法指令的两倍,因为在减法中,操作数的次序是重要的。(也就是说,
+b = b+ ,但是,-b ≠ b- ) 。对于每⼀条指令,都有⼀条跟它次序相反的反向指令。
这些反向指令要都是以R或RP结尾。图6.5展⽰了⼀⼩段代码:对⼀个双字数组的元素
求和。在第10和第13⾏中,你必须指定内存操作数的⼤⼩。否则汇编器将不会知道内
存操作数是⼀个单精度浮点数(双字)还是双精度数(四字) 。
乘法和除法
乘法指令和加法指令完全类似。
不要惊讶,除法指令和减法指令⾮常类似。除以0结果将是⼀个⽆穷数。
⽐较
协处理器同样能执⾏浮点数的⽐较操作。FCOM家族的指令就是执⾏⽐较操作的。
这些指令会改变协处理器状态寄存器中的 ⽐特位的值。不幸的
是,CPU直接访问这些位是不可能的。条件分⽀指令使⽤FLAGS寄存器,⽽不是协处
理器中的状态寄存器。但是,使⽤⼏条新的指令可以相当容易地将状态字的⽐特位传
递到FLAGS寄存器上相同的⽐特位中。
图6.6展⽰了⼀⼩段样例代码。第5⾏和第6⾏将 ⽐特位传递到
FLAGS寄存器相同的⽐特位中了。传递了这些⽐特位,所以它们就类似于两个⽆符号
整形的⽐较结果。这也是为什么第7⾏使⽤JNA指令的缘故。
Pentium处理器(和它以后的处理器(Pentium II nd III))⽀持两条新⽐较指令,⽤来直接
改变CPU 中FLAGS寄存器的值。
图6.7展⽰了⼀个⼦程序例⼦:使⽤FCOMIP指令来找出两个双精度数的较⼤值。不要
把这些指令和整形⽐较函数(FICOM 和FICOMP)混起来。
W3Cschool ( )最⼤的技术知识 享与学习平台
此篇内容来⾃于 ⽹站⽤户上传并发布。
文档评论(0)