[音乐] 上一讲主要介绍了IA-32指令系统中的
传送指令,本讲接着介绍定点算术运算指令。
同样本讲所介绍的细节内容不需要记忆。
[演示] 除了传送指令以外,定点的算数运算指令
也是IA-32中常用的指令类型。
最简单的就是加减运算指令。
加减运算指令它会影响标志,也就说运算的结果会 生成符号标志、
零标志、 溢出标志和进位借位标志。
另外IA-32的加减运算指令不区分带符号数还是无符号数。
比如说加运算指令可以是addb、 addw、
addl 分别表示8位,16位和32位的加。
同样的SUB呢,也可以执行8位数的减,16位数和32位数的减。
那么这种加减运算指令都会产生标志信息。
IA-32当中还可以进行增量运算和减1运算。
比如说加1运算可以用incb, incw和incl这样的指令。
分别对8位、 16位、 32位数进行加1运算。
同样的也可以进行减1运算,这些加1或者
减1运算影响的标志是除了CF以外其他的
比如说溢出标志啊、 零标志和符号标志都会产生。
也不区分带符号和无符号运算。
取负运算也是一种单目运算和上面的增1减1 运算一样的都是单目运算,它呢,也会影响标志。
如果这个操作数是0,也就说对0进行取负的话,那么它的结果呢
是等于0,并且呢,把CF清零,否则其他的操作数 它的CF标志永远是1。
当然也可以对8位、 16位和32位数进行取负。
比较运算的话主要是通过作减法来得到标志信息,
然后根据标志确定进行跳转,这个比较也不分带符号数和无符号数的
比较,就是没有专门区分这个比较运算的,所以比较 指令就是这个CMP后面带上长度后缀,如果是
8位的话就带b,16位是w,32位是l。
运算结果不会影响寄存器的内容,只影响标志信息。
上面呢都是加减运算,那么乘除运算是不影响标志的。
乘除运算指令区分无符号数和带符号数的运算 跟上面的加减运算是不一样的。
带符号整数的乘前面要加个I。
无符号数的乘就是这两种助记符 分别表示无符号数的乘和带符号整数的乘。
同样的,除法也分无符号的除和带符号的除。
这些乘除运算都不会影响标志信息。
乘法指令它的格式有很多种。
可以在乘法指令当中给出一个操作数, 或者两个操作数或者三个操作数。
如果那个乘法指令当中只给出一个操作数
那么另一个操作数它就是隐含在累加器里面
运算的结果呢,是把累加器里面的一个乘数
和指令当中给出来的一个操作数相乘,乘出来的结果存放在
AX里面,如果是两个8位数相乘的话,乘出来的结果是个16位的数,放在AX里面。
如果原操作数是16位的数,在AX里面和这个16位的数相乘,
乘出来的结果呢就是一个32位的数,16位乘16位是32位。
32位的结果放在这两个寄存器里面,这是放 高16位,这是放低16位。
如果操作数是32位的, 比如说一个是隐含在EAX里面,另外一个是指令直接给出来的。
那么运算的结果是32乘32等于64位的一个数,那么就放在这两个寄存器里面。
所以这一种格式,就是一个操作数的这种乘法指令, 它实现的是n位数乘n位数得到2n位数的这种总运算
也可以在指令当中给出两个操作数,如果是 给出两个操作数的话,那么它的结果就是把这两个操作数相乘,
乘出来的结果放在其中的一个操作数里面。
这就是n位数乘n位数,结果是n位数的一种情况。
也可以在指令当中给出三个操作数,其中一个操作数是寄存器编号
还有一个操作数,是一个指出来的,也许是寄存器,也许是存储单元
的一个操作数,还有一个是立即数,如果是这三种操作数的话,
它的这个操作是把指令当中给出来的原操作数和立即数进行相乘,
乘出来的结果是放在寄存器里面的,这也是n位乘n位得到n位的 乘积的这样一种运算,这是乘法指令的三种形式。
除法指令在这个指令当中,只明显的给出除数,
被除数是放在另外指定的默认的一个寄存器当中的。
比如说明显给出来的这个除数如果是8位的话, 那么16位的被除数就在AX寄存器里面,
结果呢是商在AL里面,余数在AH里面。
如果指令当中给出来的除数是16位的, 那么被除数那就是32位的。
32位的被除数分别在DX和AX里面, 商是在AX里面,余数在DX里面。
也可以指定除数的位数是一个32位的数,
比如说这个除数在32位的一个寄存器里面,那么它的被除数就是一个64位的
数据,这个64位的数据隐含是在EDX和EAX里面。
EDX里面放高32位,EAX里面放低32位。
这样 构成的64位数据是一个被除数,来除以32位的除数。
这样得到32位商在EAX里面,余数呢在EDX里面,这是除法指令。
后面我们会举例子来说明,我们可以看出
上面的这些加减运算指令或者是取负指令,它们都会影响
相应的标志信息,而且也不区分操作数是带符号数还是无符号数。
完全是丢到这个运算部件里面去,当成一个01序列来运算。
运算的结果到底是按带符号数来算还是无符号数来算?
我们看后面的指令,相应的助记符是这样 一些,这个ADD指令可以实现加这个运算。
SUB指令可以实现减运算,INC这个指令可以实现加1。
DEC这个指令可以实现减1,这个可以取负。
然后比较指令对应C语言当中的一些关系运算符。
对于C语言当中的乘运算、 除运算和取模运算还有相应的
乘指令和除指令,乘法指令分成 无符号数乘法指令和带符号数的乘法指令,也可以分
别对8位,16位和32位数进行运算。
它和加减运算不同的是,它不影响 常用标志,也就是说它不会产生标志信息。
这些指令执行结果不会产生标识信息,因此也不会修改IFLEX里面的这些标志位。
[音乐]