前言:算数运算指令可以分为单操作数指令,也有双操作数指令,还有隐含操作数
操作数可分为8位和16位二进制数。其中双操作数指令不允许两个操作数都是存储器操作数,目的操作数不能是立即数。两个操作数的位数要一样
单操作数指令操作数不允许是立即数
加法指令
ADD加法指令
指令格式:ADD OPD,OPS
指令功能:OPD ⬅ OPD + OPS
源操作数加上目的操作数,结果存于目的操作数中
ADC带进位加法指令
指令格式:ADC OPD,OPS
指令功能:OPD ⬅ OPD+OPS+CF
源操作数加上目的操作数再加上标志寄存器中CF的值,结果存于目的操作数中
INC指令
指令格式:INC OPD
指令功能:OPD的内容加1,OPD可以是reg或mem,若是内存单元应指定是字节或字单元(只不影响进位位)
正确的指令格式:
1 | add CL,11H |
减法指令
SUB减法
指令格式:SUB OPD,OPS
指令功能:目的操作数减源操作数,结果存于目的操作数,结果存于目的操作数,即OPD ⬅ OPD - OPS
带借位减法指令SBB
指令格式:SBB OPD,OPS
指令功能:目的操作数减源操作数再减CF,结果存于目的操作数。即OPD ⬅ OPD - OPS - CF
减1指令DEC
指令格式:DES OPD //其中OPD的含义与INC指令相同
指令功能:OPD减1,即OPD ⬅ OPD - 1
(DEC不影响CF标志,影响其他5个标志)
求补指令NEG
指令格式:NEG OPD //OPD可以是reg或mem
指令功能:对操作数OPD进行求补运算,即对操作数OPD连同符号位求反后加1,并把结果送回OPD
对0求补时,CF = 0,其他情况CF = 1
比较指令CMP
指令格式:CMP OPD,OPS
指令功能:CMP指令与SUB指令类似,将两个操作数相减,但结果不送回OPD。该指令常用于改变标志位
该指令常用于比较两数大小。执行CMP OPD,OPS,无符号数比较时,CF = 0表示OPD大于OPS,CF = 1时表示OPS大于OPD;有符号数比较时,后面往往跟着一条转移指令,根据比较指令执行后标志寄存器的状态产生不同的分支
乘法指令
MUL无符号乘法数指令
指令格式:MUL OPD,操作数可以是reg或mem,不能是立即数
指令功能:实现两个无符号数的乘法运算。当OPD为8位字节数据时为字节相乘,将AL寄存器与OPD相乘,结果存于AX寄存器,即AX ⬅ (AL) × OPD,AL是隐含操作数,在指令中没有出现
当OPD为16位字数据时为字相乘,将AX寄存器与OPD相乘,结果存于DX和AX寄存器。即(DX)(AX) ⬅ (AX) × OPD,AX是隐含操作数
对标志位的影响:影响CF、OF标志如果乘积的高一半为0,则CF = OF = 0,否则CF = OF = 1
有符号数乘法指令IMUL
指令格式:IMUL OPD
指令功能和用法与无符号数乘法类似。只是专用于有符号数的相乘
乘法指令对标志位的影响:如果乘积的高一半为低一半的符号扩展则CF = 0;OF = 0否则CF = 1;OF = 1
除法指令
无符号除法DIV
指令格式:DIV OPD
指令功能:实现两个无符号数的除法运算。当OPD为8位字节数据时为字节相除。(16位/8位 = 商8位 余数8位)
被除数在AX中,除数在OPD中。(AX)/OPD,AL ⬅ 商,AH ⬅ 余数,AX时隐含操作数
当OPD是16位字数据相除时字相除(32位/16位 = 商16位 余数8位),被除数在DX和AX中,除数在OPD中。(DX)(AX)/OPD,AX ⬅ 商,
DX ⬅ 余数,DX和AX是隐含操作数
有符号数除法IDIV
指令格式:IDIV OPD
指令功能和用法与无符号数除法类似,只是专用于有符号数的相除
除法指令对标志位的影响:除法指令对标志没有定义。除法指令会产生结果溢出,当被除数远大于除数时便产生溢出,8086CPU中就产生编号为0的内部中断,运行相应的中断程序。程序设计时应当避免产生除法溢出
对DIV指令,当除数为字节除时商 > 8或者在字除时商 > 16时,会发生除法溢出。
对IDIV指令,当除数为0、在字节除时商不在 -128到127或者在字除时商不在-32768到32767时,会发生除法溢出。
符号扩展指令
符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,形成的操作数是各位全0(最高位为0)或者各位全1的数(最高位为1)。符号扩展不改变数据大小
字节扩展为字CBW
指令格式:CBW
指令功能:将AL的符号位扩展到AH,如AL的最高有效位是0,则AH == 00,AL的最高有效位为1,则AH = 0FFH。AL保持不变
字扩展为双字CWD
指令格式:CWD
指令功能:将AX的符号位扩展到DX,如AX的最高有效位是0,则DX = 0000H,AX的最高有效位为1,则DX = 0FFFFH。AX保持不变。
因为除法指令要求被除数的位数是除数的倍长。符号扩展指令主要用于在有符号数除法中扩展被除数的位数。对无符号数除法可直接高8位或高16位清0,以获得倍长的被除数。
1 | mov al,0F7H ;AL = F7H |
十进制数调整指令
压缩BCD码加法调整指令DAA
指令格式:DAA
指令功能:对两个压缩十进制相加运算存于AL中的结果进行调整,产生一个压缩组合的十进制数在AL中,其进位在CF中
调整操作:
若AL&0FH > 9或AF = 1:
则AL ⬅ AL + 6,AF ⬅ 1
若AL&F0H > 90H或CF = 1
则AL ⬅ AL + 60H,CF ⬅ 1
本指令跟在加法指令之后,影响标志位AF、CF、PF、SF、ZF
压缩BCD码减法调整指令DAS
指令格式:DAS
指令功能:对两个压缩十进制相减存于AL中的结果进行调整,产生一个压缩组合的十进制数存于AL中
调整操作:
若AL&0FH > 9或AF = 1
则AL ⬅ AL - 6,AF ⬅ 1
若AL&F0H > 90H或CF = 1
则AL ⬅ AL - 60H,CF ⬅ 1
本指令跟在减法指令之后,影响标志位AF、CF、PF、SF、ZF
非压缩BCD码加法调整指令AAA
指令格式:对两个未压缩十进制相加运算存于AL中的结果进行调整,产生一个未压缩的十进制数在AX中
调整操作:
若AL&0FH > 9或AF = 1;
则AL ⬅ AL - 6,AH ⬅ AH - 1,AF ⬅ 1,CF ⬅ AF,AL ⬅ AL&0FH
非压缩BCD码减法指令AAS
指令格式:AAS
指令功能:对两个未压缩十进制相减运算存于AL中的结果进行调整,产生一个未压缩十进制数存在AX中。
调整操作:
若AL&0FH > 9或AF = 1
则AL ⬅ AL - 6,AH ⬅ AH - 1,AF ⬅ 1,CF ⬅ AF,AL ⬅ AL&0FH
否则AL ⬅ AL&0FH
本指令紧跟在减法指令之后使用,使用标志位AF、CF
非压缩BCD码乘法调整指令AAM
指令格式:AAM
指令功能:对两个未压缩十进制数相乘存于AX中的结果进行调整,产生一个未压缩的十进制数存在AX中,即AH ⬅ 将AL除以0AH的商,AL⬅ 将AL除以0AH的余数
本指令应跟在MUL指令后使用,影响标志位PF、SF、ZF
非压缩BCD码除法指令AAD
指令格式:AAD
指令功能:把AX中的两个未压缩十进制数进行调整,然后可按DIV指令实现两个未压缩十进制数的除法算,其结果为未压缩十进制商
**(在AL中)和余数(在AH中)**,即AL ⬅ AH × 10 + AL,AH ⬅ 0
本指令应在除法运算之前使用,对AX中的压缩十进制数进行调整,调整后再进行二进制除法运算,这与前述的加减乘法的调整过程是不同的。本指令影响标志位PF、SF、ZF