【8086彙編基礎】06--算術運算與邏輯指令

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,否則爲

  • Direction Flag (DF) - 方向標誌,在串處理指令中控制處理信息的方向用。當DF爲1時,每次操作後使變址寄存器SI和DI減量,這樣就使串處理從高地址向低地址方向處理。當DF爲0時,則使SI和DI增量,使串處理從低地址向高地址方向處理。



這裏有3組指令.



第一組: ADDSUB,CMPANDTESTORXOR

支持如下操作數:

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, 等等...


執行之後,結果經常存放在第一個操作數中。CMPTEST指令隻影響標誌位,並不返回數值(這兩條指令是用來在程序運行中判斷的)上述指令影響如下標誌位

       CFZFSFOFPFAF.

  • ADD - 將第二個操作數加第一個操作數上 

  • SUB - 從第一個操作數中減去第二個操作數

  • CMP - 從第一個操作數中減去第二個操作數,但隻影響標誌位

  • AND - 兩個操作數各個位邏輯與運算。運算法則如下
    1 AND 1 = 1
    1 AND 0 = 0
    0 AND 1 = 0
    0 AND 0 = 0
    只有當兩個操作數都是1時,運算結果纔是1

  • TEST - 和上面的and 操作一樣,但是隻影響標誌位

  • OR - 兩個操作數各個位邏輯或運算。運算法則如下
    1 OR 1 = 1
    1 OR 0 = 1
    0 OR 1 = 1
    0 OR 0 = 0
    如果操作數中有1那麼結果一定是1

     

  • XOR -  兩個操作數各個位邏輯異或運算。運算法則如下
    1 XOR 1 = 0
    1 XOR 0 = 1
    0 XOR 1 = 1
    0 XOR 0 = 0
    當兩個操作數不同時,結果爲1


第二組: MULIMULDIVIDIV

支持如下操作數:

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 指令隻影響 CFOF標誌位
       
運算後如果結果超出範圍,這些標記位置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 = 餘數(取模後的餘數) 
    .


第三組: INCDECNOTNEG

支持如下操作數:

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...

INCDEC 指令隻影響如下標誌位:
       ZFSFOFPFAF.

NOT 指令不影響任何標誌位

NEG i指令隻影響如下操作位
       CFZFSFOFPFAF.

    • NOT - 對與操作數每一位取反

    • NEG - 對操作數取反

      實際上它對每一位取反然後在最後一位加1。例如5會變成-5,-2會變成2。(這裏所說運算應當是計算機內部的補碼運算)

 

<<< 上一部分 <<<【8086彙編基礎】05--常用函數庫文件--emu8086.inc

>>> 下一部分 >>>【8086彙編基礎】03--變量、數組和常量的處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章