算术指令
IBMPC机的算术运算指令包括二进制运算及十进制运算指令。算术指令用来执行算术运算,它们中有双操作数指令,也有单操作数指令。如前所述,双操作数指令的两个操作数中除源操作数为立即数的情况外,必须有一个操作数在寄存器中。单操作数指令不允许使用立即数方式。算术指令的寻址方式,均遵循这两个规则。
(一)加法指令
ADD 加法
ADC 带进位加法
INC 加1
1.ADD 加法指令
格式: ADD DST,SRC
执行的操作;(DST)〈一 (SRC)十(DST)
2.ADC 带进位加法指令
格式: ADC DST,SRC
执行的操作:(DST) 〈— (SRC)十(DST)十CF (CF为进位位的值)。
3.INC 加1指令
格式 INC OPR
执行的操作:(OPR)〈— (OPR)十1
以上三条指令都可以做字或字节运算,而且除INC指令不影响CF标志位外,它们都影响条件标志位。
下面介绍标志位的变化规则
有进位时CF=1,无进位时CF=0。OF位则根据操作数的符号及其变化情况来设置;若两个操作数的符号相同,而结果的符号与之相反时,OF=1;否则OF=0。溢出位OF既然是根据数的符号及其变化来设置的,当然它是用来表示带符号数的溢出的。
关于CF的使用:
CF位可以用来表示无符号数的溢出。由于无符号数的最高有效位只是数字意义,而无符号怠义,所以从该位产生的进位应该是结果的实际进位值,但是在有限数位的范围内就说明了结果的溢出情况,另一方面,它所保存的进位值有时是有用的。例如,双字长数运算时,可以利用进位值把低位字的进位计入高位字中等。这可以根据不同情况在程序中加以处理。
OF位可以用来表示带符号数的溢出,CF位可以用来表示无符号数的溢出。
说明:因为OF表示的只是有符号数 即只有两个操作数符号相同,而结果的符号与之相反时,OF=1,即表示有符号数溢出。
CF是进位标志,如果不是上述的地位字的进位加到高位,即在有限的数位内如果无符号数相加结构进位了,则说明相加结构溢出。
(二)减法指令
SUB 减法
SBB 带借位减法
DEC 减1
NEG 求补
CMP 比较
1.SUB 减法指令
格式: SUB DST,SRC
执行的操作:(DST)〈一 (DST)- (SRC)
2.SBB 带借位减法指令
格式: SBB DST, SRC
执行的操作;(DST) 〈一 (DST) - (SRC) - CF
其中CF为进位位的值。
3。DEC 减1指令
格式: DEC OPR
执行的操作:(OPR)〈一 (OPR) - 1
4.NEG 求补指令
格式: NEG OPR
执行的操作:(OPR) 〈一 -(OPR)
亦即把操作数按位求反后末位十1,因而执行的操作也可表示为
(OPR)〈— 0FFFFH - (OPR)十1
5.CMP 比较指令
格式: CMP OPRl,OPR2 .
执行的操作;(OPRl) - (OPR2)
注意:CMP指令进行与SUB减法操作相似,但是不保存结果,它起到改变条件标志位的作用。
以上五种指令均可以进行字节或字运算,除DEC指令不影响CF标志外,它们都影响条件标志位。
减法运算的条件码情况与加法类似。CF位说明无符号数相减的溢出,同时它又确实是被减数的最高有效位向高位的借位值。OF位则说明带符号数的溢出。
当作为无符号数运算时,若减数>被减数,此时有借位则CF=1,否则CF=0。
减法的OF位的设置方法为:若两个数的符号相反,而结果的符号与减数相同则OF=1,除上述情况外OF=0。OF=1说明带符号数的减法溢出,结果是错误的。
NEG指令的条件码设置情况:NEG指令的条件码按求补后的结果设置:只有当操作数为0时求补运算的结果使CF=0,其它情况则均为1。所以只有当字节运算时对一128求补以及字运算时对一32768求补的情况下OF=1,其它则均为0。
例子:设X,Y均为双精度数,它们分别存放在地址为X,X十2;Y,Y十2的存储单元中,存放时,高位字在高地址中,低位字在低地址中。下列指令序列实现:X+Y
MOV AX,X
MOV DX,X+2
ADD AX,Y
ADC DX,Y+2;用ADC将进位的值也加上
(三)乘法指令
MUL 无符号数乘法
IMUL 带符号数乘法
1.MUL 无符号数乘法指令
格式: MUL SRC
执行的操作:
字节操作数:(AX) 〈一 (AL)*(SRC)
字操作数: (DX,AX) 〈— (AX)*(SRC)
2.IMUL 带符号数乘法指令
格式; IMUL SRC
执行的操作:与MUL相同,但必须是带符号数。而MUL是无符号数。
注意:
(1) 在乘法指令里,目的操作数必须是累加器,字运算为AX,字节运算为AL。两个8位相乘得到的16位乘机存放在AX中,两个16位数相乘得到的是32位乘积,存放在DX,AX中,其中DX存放高字节,AX存放低字节。
(2) 指令中的源操作数可以使用除立即数方式以外的任一种寻址方式。
MUL指令和IMUL指令的使用条件是由数的格式决定的。很明显(11111111b)*(11111111b)当把它看作无符号数时应为255d×255d=65025d;而把它看作带符号数时则为(一1)×(一1)=1。因此必须根据所要相乘数的格式来决定选用哪一种指令。
乘法指令对除CF和OF以外的条件码位无定义(注意:无定义的意义和不影响不同,无定义是指指令执行后这些条件码位的状态不定,而不影响则是指该指令的结果并不影响条件码,因而条件码应保持原状态不变)。
(3) 对于MUL指令,如果乘积的高一半为0、即字节操作的(AH)或字操作的(DX)为0,则CF和OF均为0;否则(即字节操作时的(AH)或字操作时的(Dx)≠0)则CF和OF均为1。这样的条件码设置可以用来检查字节相乘的结果是字节还是字,或者可以检查字相乘的结果是字还是双字。
(4) 对于IMUL指令,如果乘积的高一半是低一半的符号扩展则CF和OF均为0,否则就均为1。
例. 如(AL)=0B4H,(BL)=11H求执行指令
IMUL BL和MUL BL 后的乘积值。
(AL)=0B4H为无符号数的180D,带符号数的一76D
(BL) =11H为无符号数的17D,带符号数的17D
执行IMUL的结果为: (AX)=0FAF4H==-1292D
执行MUL 的结果为: (AX)=0BF4H=3060D
CF = OF =1。
(四)除法指令
DIV 无符号数除法
IDIV 带符号数除法
由于使用除法指令的需要,这里顺便介绍两条符号扩展指令
CBW 字节转换为字
CWD 字转换为双字
1.DIV 无符号数除法指令
格式为: DIV SRC
执行的操作:
字节操作:16位被除数在AX中,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中。表示为:
(AL)〈— (AX)/(SRC)的商
(AH)〈一 (AX)/(SRC)的余数
字操作:32位被除数在DX、AX中,其中DX为高位字;16位除数为源操作数,结果的16位商在AX中,16位的余数在DX中。表示为:
商和余数均为无符号数。
2.IDIV 带符号数除法指令
格式: IDIV SRC.
执行的操作: DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号和被除数的符号相同。
注意:
(1) 除法指令的寻址方式与乘法指令相同。其目的操作数必须存放在AX或DX中。
(2) 其源操作数可以用除立即数以外的任何寻址方式。
(3) 除法指令对所有条件码均无定义。
由于除法指令的字节操作要求被除数为16位,字操作要求被除数为32位,因此常常需要用符号扩展的办法取得除法指令所需要被除数的格式,为此需要进行如下符号扩展指令来实现符号扩展的功能:
3.CBW字节转换为字指令
格式. CBW
执行的操作:DL的内容符号扩展到AH
如(AL)的最高有效位为1,则(AH)=0FFH。
4. CWD字转换为双字指令
格式: CWD
执行的操作:AX的内容符号扩展到DX。即如(AX)的最高有效位为0,则(DX)=0000H;如(AX)的最高有效位为l,则(DX)=0FFFFH。
这两条指令都不影响条件码。
注意除法指令的溢出:
除法要求字节操作时商为8位,字操作时商为16位。如果字节操作时,被除数的高8位绝对值 〉除数的绝对值;或字节操作时,被除数的高16位绝对值 〉除数的绝对值,这时商就会产生溢出(注意符号位的扩展造成,当有效位最高位为1时,进行无符号计算,容易出现溢出),这种溢出的处理由中断来进行处理,为了避免这种情况,必要时程序应该进行溢出判断及处理。
例. 设(AX)=0400H,(DL)=0B4H
即(AX)为无符号数的1024D,带符号数的十1024D
(DL)为无符号数的180D, 带符号数的一76D
执行 DIV BL的结果是:
(AH) = 7CH = 124D 余数
(AL)=05H=5D 商
IDIV BL的结果是:
(AH)=24H=36D 余数
(AL)= 0F 3H=-13D 商
十进制调整指令
DAA 加法的十进制调整指令
执行的操作:
(AL)〈— 把从AL中的和调整到压缩的DCD格式,这条指令之前必须执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存放在AL寄存器中。本指令的调整方法是;
如果AF标志(辅助进位位)为1,或者AL寄存器的低4传是十六进制的A – F,则AL寄存器内容加06H,且将AF位置入1。
如果CF标志为1,或者AL寄存器的高4位是十六进制的A – F,则AL寄存器内容加 60H,并将CF位置1。
DAA指令对OF标志无定义,但影响所有其它条件标志。
例. ADD AL,BL
DAA
如指令执行前, (AL)=28, (BL)=68
28 | 0010 1000 |
68 | 0110 1000 |
+ | 1001 0000 |
执行ADD指令后(AL)=90,CF=0,AF=1
执行DAA指令时.因AF=1而做
(AL)〈一(AL)+06
得(AL)=96,CF=0,AF=结果正确。
DAS 减法的十进制调整指令
执行的操作:
(AL)〈一 把AL中的差调整到压缩的BCD格式。
这条指令之前必须执行SUB或SBB指令,减法指令必须把两个BCD码相减、并把结果存放在AL寄存器中。本指令的调整方法是;
如果AF标志为l,或者AL寄存器的低4位是十六进制的A—F,则使AL寄存器的内容减去06H.并将AF位置1。
如果CF标志为1,或者AL寄存器的高4位是十六进制的A—F,则使AL寄存器的内容减去60H,并将CF位置l。
三、逻辑运算指令
AND 逻辑与
OR 逻辑或
NOT 逻辑非
XOR 异或
TEST 测试
TEST 测试指令
格式: TEST OPRl,OPR2
执行的操作;(OPR1) ∧(OPR2)
注意:两个操作数相与的结果不保存,只根据其特征置条件码。
(1) 以上五种指令中,NOT不允许使用立即数,其它4条指令除非源操作数是立即数,至少有一个操作数必须存放在寄存器中,另一个操作数则可以使用任意寻址方式。
(2) 它们对标志位的影响情况是:NOT指令不影响标志位,其它4种指令将使CF和OF为0,AF位无定义,而SF、ZF和PF则根据运算结果设置。