zoukankan      html  css  js  c++  java
  • 特殊的算术操作指令具体解释

    特殊的算术操作指令具体解释

    前言

    上一讲,我们说了常见的算术与逻辑运算指令,当中比較有特点的是leal指令,本次我们在介绍几个较特殊的操作指令,这些指令能够让仅仅有32位的寄存器存储64位的数据是不是非常吊?

    正文

    我们来看一下这些指令的大致介绍,假设又细致看过上一讲的内容,可能会发现这里的指令有些眼熟,可是他们的作用却截然不同.下面是书中的一张概图:

     

    第一个指令非常眼熟吧,他就是我们上一章说的imull乘法指令的双字形式.只是能够看出,这里的imull指令已经全然变了了个人,他将结果存入两个寄存器.接下来,我们来看看这些指令.

    imull,mull指令

    这两个指令一看就是双胞胎,他们一个负责有符号位全64位乘法,一个负责无符号位全64位乘法.imull这个指令好像是负责乘法的指令,并且在之前的乘法并没有区分有符号和无符号,如今怎么又成了双胞胎了呢?

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

    本次我们讨论imull指令,则与上面的普通乘法指令稍有不同,他仅仅有一个操作数,也就是说,他的一般形式为imull S,而另外一个操作数默觉得%eax寄存器.终于的结果,会将高32位存入%edx寄存器,而低32位存入%eax寄存器.

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

    接下来我们看一个案例,我们去看指令imull $0x3的结果,我们如果此时%eax寄存器的值为0x82345600.也就是我们须要你计算0x3*0x82345600的值,这里我直接给出了两者相乘的十六进制表示,0xFFFF FFFE 869D 0200.这个结果也是64位的,因此我们寄存器的前后状态为:

     

    能够看出来,%eax保存着低32位的结果,单说这32位的话,他的有符号数值为-2036530688,正是我们直接计算0x3*0x82345600位截断后的有符号值,显然这个结果一出了.假设组合上高32,则结果为-6331497984,将它加上或者取模(232次方)将得到我们32位的结果.这里的有符号乘法採取的是先符号位扩展被乘数,然后两者相乘,将结果再阶段为64位所得.

    对于mull的单操作数指令来说,就非常easy了,它採用的是无符号乘法,因此就和我们平时的十进制乘法类似可,仅仅是相同的,他也会将结果的高32位存入%edx,将低32位存入%eax

    cltd指令

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

    idivl,divl指令

    这两个指令玉前面的imullmull类似,它也将计算结果粗放在两个寄存器其中,其中余数存放在%edx寄存器,商存放在%eax寄存器.假设你能了解前面说的imullmull,那么这里的idivldivl理解起来就会非常easy.

    举个样例,考虑指令idivl $0x3的结果,我们结社此时%eax寄存器的值为0x82345600.也就是数我们须要计算0x82345600/0x3的值,在这里我直接给出两数相除的16进制表示,商为0xD6117200.余数为0x0.因此我们寄存器的前后状态例如以下所看到的:

     

    能够看出,idivl这个指令运行的过程中,事实上对被除数进行了符号扩展,类似于cltd指令,,或者有时也会将%eax移动到%edx,然后对%edx进行算术右移31位的运算.这两种方式的结果是一样的,都是将%eax符号扩展32位并存储在%edx其中.

    小小的结一下

    本次我们介绍了一下介个特殊的算术运算指令,事实上这些指令的运算规则都是建立在二进制算术规则的基础上的,二进制算数规则就是这些指令的运行方式规定.

  • 相关阅读:
    使用MailKit发送邮件
    移动APP设备锁功能开发中的问题
    Xamarin.Form指纹认证
    Android App安装启动时签名校验
    网络编程学习资料
    ASP.NET Core 2.1发布/部署到Ubuntu并配置Nginx反向代理实现ip访问
    @media用法解释
    CSS calc() 函数
    css3属性box-sizing:border-box 用法解析
    浮动塌陷-overflow:hidden来解决
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6993292.html
Copyright © 2011-2022 走看看