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

8086彙編語言初學者教程(第6部分)html

運算與邏輯指令
 
算法

大多數運算與邏輯指令影響處理器的狀態標記寄存器

數組

 
 

從上圖能夠看到,這是狀態標記寄存器是一個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組指令.

spa



第一組: ADDSUB,CMPANDTESTORXOR

支持以下操做數:

htm

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.

blog

  • 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

支持以下操做數:

get

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--變量、數組和常量的處理

相關文章
相關標籤/搜索