算術運算、邏輯運算與移位操作指令
加法運算類指令
加法指令
普通加法指令 \(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\)