前言:公号 「编程有料」后台回复 “大礼包” 即可获取近1000本助力你编程之路的电子书
算术运算指令
算术运算指令(重点)
- 实现加法、减法、乘法、除法、BCD码运算后的调整
- 大部分指令影响标志寄存器中的状态标志位
常见的算术运算指令
1,不带进位加法指令ADD
格式:ADD d,s
功能:(d)←(d)+(s)
说明:操作数不能使用段寄存器。下图辅助记忆:
2,带进位加法指令ADC
格式:ADC d,s
功能:(d)←(d)+(s)+CF
说明:将目的操作数d 与源操作数s 和进位标志CF 相加结果送回d 中
如下例题辅助理解:
例:设AX=1000H,CF=1,分析以下指令的执行结果(AX=? CF=?)
(1) ADD AX,100H ;AX=1100H,CF=0
(2)ADC AX,100H ;AX=1101H,CF=0
(3) ADC AH,0F0H ;AX=0100H,CF=1
3,加一指令INC
格式:INC d
功能:(d)←(d) +1
说明:将目的操作数d 加1 后结果送回d 中
注意:INC不影响CF标志
例:设AX=0FF00H,CF=0,则执行下列指令后,AX=? CF=?
(1) INC AX ;AX=OFF01H,CF=0
(2)INC AH ;AX=0000H,CF=0
4,不带进位减法指令SUB
格式:SUB d,s
功能:(d) ←(d)一(s)
说明:将目的操作数d 与源操作数s 相减结果送回d 中
5,带进位减法指令SBB
格式:SBB d,s
功能:(d)←(d)-(s) - CF
说明:将目的操作数d 与源操作数s 和进位标志CF 相减结果送回d 中
例:设AX=1101H,CF=1,则执行下列指令后,AX=? CF=?
(1)SUB AX,100H ;AX=1001H,CF=0
(2)SBB AX,100H ;AX=1000H,CF=0
(3)SBB AH,11H ;AX=OFF01H,CF=1
6,减一指令DEC
格式:DEC d
功能:(d)←(d)-1
说明:将目的操作数d 减1后结果送回d 中
注意:DEC不影响CF标志
7,取负指令NEG
格式:NEG d
功能: (d) ← -(d)+1
说明:将目的操作数取负后送回d 中
例:设AX=00FFH,则执行下列指令后,AX=?
NEG AX ;AX=FF01H
NEG AL ;AX=0001H
8、比较指令CMP
格式:CMP d,s
功能:(d)一(s)
说明:仅将目的操作数d 与源操作数s 相减,结果并不送回d 中
9,加法的压缩BCD 码调整指令 DAA
格式:DAA
功能:对AL 中的压缩BCD 码加法结果进行调整。
说明:必须紧跟在ADD/ADC 指令之后出现。
(**注:**AF标志位:AF标志位是辅助进位标志,供BCD码使用。CF标志位:CF标志位是进位标志。)
例:设AL=25H,BL=37H,问执行下列指令序列后,AL=? CF=?
ADD AL,BL
DAA
// 25H+37H=5CH,(其中C>9,故需要修正如下:)
修正:
5CH+6H=62H=01100010B
AL=62H=62BCD . CF=0
最后再来一个例题加深对BCD 码的理解:
设AX 和BX 中存放着两个4 位的压缩型BCD 码,求两数之和,并将和放在AX 中(一个16 位的寄存器中可以存放一个4 位的BCD 码)。
代码如下:
ADD AL,BL ;低字节相加
DAA ;低字节调整
MOV CL,AL ;空出AL
MOV AL,AH
ADC AL,BH ;高字节相加
DAA ;高字节调整
MOV AH,AL
MOV AL,CL ;这就是之前为什么要用MOV CL,AL的原因。
//仔细阅读体悟还是从中学点东西的