《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 解决方案 > 计算机系统原理(十七) 特殊的算术操作指令详解

计算机系统原理(十七) 特殊的算术操作指令详解

2017-06-22
关键词: 汇编语言

上一章我们讨论了常见的算术与逻辑运算指令,其中比较有特点的是leal指令,本章我们再来看几个比较特殊的操作指令,这些指令可以让只有32位的寄存器存储64位的数据,是不是十分霸气侧漏呢。

imull、mull指令

这两个指令一看就是双胞胎,它们一个负责有符号全64位乘法,一个负责无符号全64位乘法。细心的猿友会发现,imull这个指令好像是负责乘法的指令,而且在之前的乘法并没有区分有符号和无符号,现在怎么又成双胞胎指令了。

我们上一章当中出现的指令是imul指令,当它操作双字的时候,也就是imull指令。不过不同的是,它的一般形式是imull S D,这里有两个操作数,它将计算S和D的乘积并截断为双字,然后存储在D当中。由于在截断时,无符号以及有符号的二进制序列是一样的,因此此处的乘法指令并不区分有符号和无符号。

本次我们讨论的imull指令,则与上面的普通乘法指令稍有不同,它只有一个操作数,也就是说,它的一般形式为imull S,这点在书中的表格中也能看出来,而另外一个操作数默认为%eax寄存器。最终的结果,会将高32位存入%edx寄存器,而低32位存入%eax寄存器。

试想一下,如果我们只取%eax寄存器当中的32位结果,那其实这里计算的结果就是S*%eax,此时imull S的作用就与imull S D是一样的,只是目的操作数被固定为%eax罢了。

cltd指令

这个指令相对来说就非常简单了,它就是简单的将%eax寄存器的值符号扩展32位到%edx寄存器,也就是说,如果%eax寄存器的二进制序列的最高位为0,则cltd指令将把%edx置为32个0,相反,如果%eax寄存器的二进制序列最高位为1,则cltd指令将会自从填充%edx寄存器为32个1。

idivl、divl指令

这两个指令与前面的imull以及mull类似,它也将计算结果存放在两个寄存器当中,其中余数存放在%edx寄存器,商存放在%eax寄存器。如果各位理解了前面的imull以及mull,那么这里idivl和divl理解起来会非常简单。

文章小结

本章介绍了几个特殊的算术运算指令,其实这些指令的运算规则都建立在2.X的基础之上,2.X当中所介绍的二进制算术规则,就是这些指令的执行方式规定。理解这些指令的指令方式,有助于提高我们联系程序代码与汇编代码之间的对应关系的能力,这是非常有用的。





本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。