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