汇编-加减法指令
算术运算、逻辑运算与移位操作指令
加法运算类指令
加法指令
普通加法指令 \(ADD\) 影响 \(6\) 个标志位
带进位加法指令 \(ADC\) 影响 \(6\) 个标志位
加 \(1\) 指令 \(INC\) 影响 \(5\) 个标志位 不会影响 \(CF\)
使用 \(ADC\) 之前要先把 \(CF\) 清零
\(INC\) 的操作数不可以是段寄存器和立即数
求内存数据段中 \(M1\) 和 \(M2\) 为首的 两个 \(20\) 字节数之和,并将结果写入 \(M2\) 为首的区域中
按照字节运算
LEA SI, M1
LEA DI, M2
MOV CX, 20
CLC ; 使CF = 0
NEXT: MOV AL, [SI]
ADC [DI], AL
INC SI
INC DI
DEC CX
JNZ NEXT
HLT
按照字运算
LEA SI, M1
LEA DI, M2
MOV CX, 10
CLC ; 使CF = 0
NEXT: MOV AX, [SI]
ADC [DI], AX
ADD SI, 2
ADD DI, 2
DEC CX
JNZ NEXT
HLT
减法运算类指令
\(SUB :\) 对标志位的影响与 \(ADD\) 相同
\(SBB :\) 对标志位的影响与 \(INC\) 相同 对操作数的要求及对标志位的影响与 \(SUB\) 相同
\(SUB : \ OPRD1 \ - \ OPRD2 \ - \ CF \ ----> \ OPRD1\)
\(DEC\) 对操作数的要求及对标志位的影响与 \(INC\) 相同
应用程序例
; 程序功能: 延时(定时)
MOV BL, 2
NEXT1: MOV CX, 0FFFFH ; 0是为了让计算机识别这是一个16进制数字
NEXT2: DEC CX
JNZ NEXT2 ;ZF=0 转NEXT2
DEC BL
JNZ NEXT1 ; ZF=0 转NEXT1
HLT ;暂停执行
\(NEG\) 指令
\(NEG \ OPRD\) $$8/16位寄存器或存储器操作数$$
\(0 \ - \ OPRD \ ----> \ OPRD\)
因此这个指令又叫求补指令
执行\(NEG\)指令之后,一般情况下都会使得 \(CF\) 为 \(1\) ,除非给定的操作数为零才会使 \(CF\) 为 \(0\)
当指定的操作数的值为 \(80H(-128)\) 或者 \(8000H(-32768)\) ,则执行 \(NEG\) 指令后 结果不变,但 \(OF\) 置一,其他情况下 \(OF\) 均置零
\(CMP\) 指令
\(CMP \ OPRD1, OPRD2\)
操作 \(OPRD1 \ - \ OPRD2\)
指令执行的结果不影响目标操作数,仅影响标志位
常用于比较两个数字的大小
两个无符号数的比较
\(CMP \ AX, BX\)
若 \(AX \ge BX\) 则 \(CF = 0\)
若 \(AX < BX\) 则 \(CF = 1\)
若 \(AX = BX\) 则 \(CF = 0, ZF = 1\)
两个带符号数的比较
\(CMP \ AX, BX\)
两个数字的大小由 \(OF\) 和 \(SF\) 共同决定
\(OF\) 和 \(SF\) 状态相同 \(AX \ge BX\)
\(OF\) 和 \(SF\) 状态不同 \(AX < BX\)
\((异或相同 \ 不同)\)
\(CMP\) 指令示例
LEA BX, MAX LEA SI, BUF MOV CL, 20 MOV AL, [SI] NEXT : INC SI CMP AL, [SI] JNC GOON ; CF=0转移 XCHG [SI], AL GOON: DEC CL JNZ NEXT MOV [BX], AL HLT
程序功能 在 \(20\) 个数字中寻找最大值并放入 \(MAX\)