加法指令对双操作数的要求与MOV指令基本相同,但有一点:段寄存器不能作为加法指令的操作数。
指令格式: ADD OPRD1,OPRD2 ;OPRD1<—OPRD1+OPRD2
按操作数分,其指令格式分为
注意:
功能: 将源操作数和目标操作数相加,结果送回目标地址中。
示例:
合法的示例:
ADD CL,20H ; CL <—— CL + 20H 目的操作数的寻址方式是寄存器寻址,源操作数是立即寻址
ADD DX,[BX+SI] ; DX <—— DX + [BX+SI] 目的操作数的寻址方式是寄存器寻址,源操作数是存储器的基址加变址寻址
非法的示例:
ADD [SI],[BX] ;不允许两个操作数都是存储器操作数
ADD DS,AX ;不允许把段寄存器作为操作数
对状态标志位的影响: 对全部6个状态标志位都会产生影响。
指令格式: ADC OPRD1,OPRD2 ;OPRD1<—OPRD1+OPRD2+CF
按操作数分,其指令格式分为
ADC与ADD指令在功能、格式及对标志位的影响上都基本相同,只是相加时要包括进位CF的内容。
功能: 主要用于多字节运算。由于8086一次最多只能实现两个16位数相加,故对多于两个字节的数的加法,只能先加低16位(或低8位),再加高16位(或高8位),但在高位相加时,必须要考虑低位向上的进位,这时就需使用ADC指令。
对状态标志位的影响: 对全部6个状态标志位都会产生影响。
思考:两个四字节的无符号数相加,0107A379H + 10067E4FH = ?
指令格式: INC OPRD ;OPRD <— OPRD + 1
按操作数分,其指令格式分为:
功能: 将指定操作数的内容加1,通常用于在循环程序中修改地址及循环次数等。
注意: OPRD不能是段寄存器,也不能是立即数。
对状态标志位的影响: 不影响CF标志位,但对其他5个状态标志AF、OF、PF、SF及ZF会产生影响。
指令格式: SUB OPRD1,OPRD2 ;OPRD1<—OPRD1-OPRD2
按操作数分,其指令格式分为:
功能: 用目标操作数减去源操作数,并将结果送目标操作数所在地址中。
比较: 对操作数的要求以及对状态标志位的影响与ADD指令完全相同。
指令格式: SUB OPRD1,OPRD2 ;OPRD1<—OPRD1-OPRD2-CF
按操作数分,其指令格式分为:
功能: 用目标操作数减去源操作数以及标志位CF的值,并将结果送目标操作数所在地址中。
比较: 对操作数的要求以及对状态标志位的影响与ADC指令完全相同。
指令格式: DEC OPRD ;OPRD <— OPRD - 1
按操作数分,其指令格式分为:
功能: 一条单字节指令,将操作数的值减1,再送回该操作数所在地址。
比较: 对操作数的要求以及对状态标志位的影响与INC指令完全相同。
思考:编写一个延时指令。
指令格式: NEG OPRD ;OPRD<— 0 - OPRD
按操作数分,其指令格式分为:
功能: 由于对一个操作数取补码等于用0减去此操作数,故利用NEG可以得到负数的绝对值。(需要花点时间理解)
示例:设AL=FFH,执行指令NEG AL后,AL=0-FFH=01H,即实现了对FFH(-1的补码)求补,或者说得到了AL中负数的绝对值。
注意:
指令格式: CMP OPRD1,OPRD2 ;OPRD1-OPRD2,结果返回到标志位上。
功能: 比较两个操作数谁大谁小,或是相等。一般会在比较指令之后都紧跟一个条件转移指令,根据比较结果决定程序的转向。
判断方法:
比较: 对操作数的要求以及对状态标志位的影响与SUB指令完全相同。