8086彙編語言初學者教程(第6部分)
運算與邏輯指令
大多數運算與邏輯指令影響處理器的狀態標記寄存器。
從上圖可以看到,這是狀態標記寄存器是一個16位寄存器
每一位稱作一個標誌位,可以取值 1 或者 0 。
- 進位標誌 Carry Flag (CF) - 出現無符號(unsigned overflow)溢出該位設置成1。例如,計算 255+1(結果超出0...255)。沒有溢出時該位爲0。
- 零標誌 Zero Flag (ZF) - 當結果爲 0 時設置爲1,結果不爲 0 時設置爲0。
- 符號標誌 Sign Flag (SF) - 結果爲負置1,結果爲正置爲0。事實上該位對於結果特別重要。
- 溢出標誌 Overflow Flag (OF) - 當出現有符號數溢出設置爲1。例如,計算100+50(結果超出-128-127的範圍)。
- 奇偶標誌 Parity Flag (PF) - 當結果操作數中1的個數爲偶時置1,否則爲0注意,如果結果是一個字,該標誌只指示低8位。
- 輔助進位標誌 Auxiliary Flag (AF) - 低4位向上進位時置1,否則爲0(記錄運算時第3位(半個字節)產生的進位值。例如,執行加法指令時,最高有效位有進位時置1,否則置0
- 中斷標誌 Interrupt enable Flag (IF) - 當cpu容許中斷時爲1,否則爲0
- Direction Flag (DF) - 方向標誌,在串處理指令中控制處理信息的方向用。當DF爲1時,每次操作後使變址寄存器SI和DI減量,這樣就使串處理從高地址向低地址方向處理。當DF爲0時,則使SI和DI增量,使串處理從低地址向高地址方向處理。
這裏有3組指令.
第一組: ADD, SUB,CMP, AND, TEST, OR, XOR
支持如下操作數:
REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate
REG(寄存器): AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory(內存): [BX], [BX+SI+7], 變量,等等...
immediate(立即數): 5, -24, 3Fh, 10001101b, 等等...
執行之後,結果經常存放在第一個操作數中。CMP和TEST指令隻影響標誌位,並不返回數值(這兩條指令是用來在程序運行中判斷的)上述指令只影響如下標誌位:
CF, ZF, SF, OF, PF, AF.
- ADD - 將第二個操作數加至第一個操作數上
- SUB - 從第一個操作數中減去第二個操作數
- CMP - 從第一個操作數中減去第二個操作數,但隻影響標誌位.
- AND - 兩個操作數各個位邏輯與運算。運算法則如下
1 AND 1 = 1
只有當兩個操作數都是1時,運算結果纔是1。
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0 - TEST - 和上面的and 操作一樣,但是隻影響標誌位。
- OR - 兩個操作數各個位邏輯或運算。運算法則如下
1 OR 1 = 1
如果操作數中有1那麼結果一定是1。
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0 - XOR - 兩個操作數各個位邏輯異或運算。運算法則如下
1 XOR 1 = 0
當兩個操作數不同時,結果爲1。
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0
第二組: MUL, IMUL, DIV, IDIV
支持如下操作數:
REG
memory
REG(寄存器): AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory(內存): [BX], [BX+SI+7], variable, etc...
MUL and IMUL 指令隻影響 CF, OF標誌位。
運算後如果結果超出範圍,這些標記位置1,如果沒有超過
範圍,置0
DIV 和 IDIV 指令對於標誌位無影響
- MUL - 無符號乘:
當操作數是字節時:
AX = AL * 操作數.當操作數是字時:
(DX AX) = AX * 操作數. - IMUL - 有符號乘法:
當操作數是字節時:
AX = AL * 操作數.當操作數是字時:
(DX AX) = AX * 操作數.
- DIV - 無符號除法:
當操作數是字節時:
AL = AX / 操作數
AH = 餘數(取模後的餘數) .當操作數是字時:
AX = (DX AX) / 操作數
DX = 餘數(取模後的餘數) - IDIV - 有符號除法:
當操作數是字節時:
AL = AX / 操作數
AH =餘數(取模後的餘數)當操作數是字時:
AX = (DX AX) / 操作數
DX = 餘數(取模後的餘數) .
第三組: INC, DEC, NOT, NEG
支持如下操作數:
REG
memory
REG(寄存器): AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory(內存): [BX], [BX+SI+7], variable, etc...
INC, DEC 指令隻影響如下標誌位:
ZF, SF, OF, PF, AF.
NOT 指令不影響任何標誌位!
NEG i指令隻影響如下操作位:
CF, ZF, SF, OF, PF, AF.
- NOT - 對與操作數每一位取反
- NEG - 對操作數取反
實際上它對每一位取反然後在最後一位加1。例如5會變成-5,-2會變成2。(這裏所說運算應當是計算機內部的補碼運算)