彙編學習筆記 第三章

3.1 指令格式

  1. 彙編指令由操作碼操作數兩部分構成

  2. 標號中的冒號表示屬性爲NEAR

  3. 對於段寄存器,CS不允許用戶干預,其他必須通過通用寄存器間接傳送。

  4. 對於單操作數指令,操作數不能是立即數

  5. 對於雙操作數指令,目的操作數不能是立即數,且操作數不能均爲內存操作數

3.2 尋址方式

  1. 立即數尋址與寄存器尋址

  2. 直接尋址

    • 符號常量通常爲立即數尋址,符號變量爲直接尋址
    • 對於符號變量(X)來說, MOV AX, X 等價於 MOV AX,[X]
  3. 寄存器間接尋址

    • 組合方式
      • DS 和 BX/SI/DI
      • SS 和 BP
    • 隱含段地址僅有DS/SS兩種,間接尋址寄存器只有BX,SI,DI,BP四種
  4. 寄存器相對尋址

    • 等價的三種表示方法
      • MOV AX, disp[SI]
      • MOV AX, [SI]+disp
      • MOV AX, [SI+disp]

    注:即在3的條件下增加一個常量偏移

  5. 基址變址尋址

    • 組合方式
    • DS * 16 + BX + SI/DI
    • SS * 16 + BP + SI/DI

    注:即在3的條件下增加一個寄存器偏移

  6. 相對基址變址尋址

    注:即在5的條件下再增加一個常量偏移

  7. 比例變址尋址

    • 要求:80386以上處理器

    • 組合方式

      • DS:基址寄存器 + 比例 * 變址寄存器 + disp
      • SS:基址寄存器 + 比例 * 變址寄存器 + disp
    • 說明

      • 基址寄存器有8個
      • 變址寄存器有7個,除去ESP
      • 基址寄存器爲ESP/EBP時默認數據段爲SS,其他默認爲DS
  8. 轉移地址相關尋址方式

    • 個數:5種

    • 影響寄存器:CS、IP

      • CS:記錄標號所在的段地址(高字)
      • IP:記錄段內偏移地址(低字)

    注:和其他尋址方式大同小異

3.3 指令系統

  1. MOV/MOVSX/MOVZX

    • MOV

      • IP 不能作爲操作數
      • 不能傳送數據給CS寄存器
      • MOV不會影響標誌寄存器
    • MOVSX

      • 源操作數是帶符號數
      • 源操作數長度小於目的操作數
      • 不影響標誌寄存器
    • MOVZX
      • 源操作數是無符號整數,擴展爲0
      • 其他同上
  2. PUSH/POP/PUSHA/POPA

    • PUSHA/POPA 在80286以上纔有效
    • PUSHA/POPA順序:AX,CX,DX,BX,SP,BP,SI,DI
  3. XCHG
    只能通用寄存器與通用寄存器互換或通用寄存器與存儲器互換。

  4. 地址傳送指令

    • LEA
      • 功能:LEA reg, mem,將mem有效地址存入reg
      • 等價指令:MOV reg, OFFSET mem
      • 要求
        • 源操作數是存儲器,目前操作數爲寄存器
    • LDS/LES/LFS/LGS/LSS
      • 說明:均爲地址指針傳送指令,後兩位表明高字傳送的目的段
      • 低字傳入寄存器
      • 等價指令:MOV BX, OFFSET X + MOV AX, SEG X
  5. 加減法指令

    • 主要影響標誌寄存器:ZF,SF,CF,OF

    • 無符號數溢出CF=1,有符號數溢出OF=1

    • ADC:運算結果 + CF

    • SBB:運算結果 - CF

    • 通常將AL擴展爲AX時,需兩步

      MOV AH, 0
      ADC AH, 0
    • 例題

      1. 求Z = X + Y,X、Y爲16位數,Z爲32位數

        注:先求和,傳送時考慮進位

        MOV AX, X
        ADD AX, Y
        MOV DX, 0
        ADC DX, 0
        MOV WORD PTR Z+2, DX
        MOV WORD PTR Z, AX      ;這兩行很關鍵
      2. 求Z = X-Y, 其中X,Y,Z均爲32位數

        注:在做減法時就考慮借位

        MOV DX, WORD PTR X + 2
        MOV AX, WORD PTR X
        SUB AX, WORD PTR Y      ;先做低位減法,無需借位
        SBB DX, WORD PTR Y + 2  ;高位減法,需要借位
        MOV WORD PTR Z, AX
        MOV WORD PTR Z + 2, DX
      3. 求W = X+Y+60-Z,其中X,Y,Z,W均爲雙字

        MOV AX, WORD PTR X
        MOV DX, WORD PTR X+2
        ADD AX, WORD PTR Y
        ADC DX, WROD PRT Y+2
        ADD AX, 60
        ADC DX, 0
        SUB AX, WORD PTR Z
        SBB DX, WORD PTR Z+2
        MOV WORD PTR W, AX
        MOV WORD PTR W+2,DX
      4. 判斷OF、CF在運算後的變化

        MOV AL, -100
        MOV AH, 88
        SUB AL, AH
        ;運算結果-188,等於-(10111100),無法表示符號位,產生溢出,OF = 1
        ;-100 = (10011100),88 = (01011000),做無符號減法,不產生借位,故CF = 0
        ;-(10111100) 補碼爲 (01000100) = 44H
        
        MOV BL, 100
        MOV BH, -88
        SUB BL, BH
        ;運算結果+188,等於+(10111100),無法表示符號位,產生溢出,OF = 1
        ;100 = (01100100),-88 = (10101000),做無符號減法,顯然產生借位,故CF = 1
        ;+(10111100)補碼爲(10111100) = 0BCH
        
        MOV CL, 100
        MOV CH, 88
        SUB CL, CH
        ;運算結果爲+12,等於+(00001100),可以表示符號位,無溢出,OF = 0
        ;100 = (01100100),88 = (01011000),做無符號減法,顯然不產生借位,故CF = 0
        ;+(00001100)的補碼爲(00001100) = 0CH
        
        MOV DL, -100
        MOV DH, -88
        SUB DL, DH
        ;運算結果爲-12,等於-(00001100),可以表示符號位,無溢出,OF = 0
        ;-100 = (10011100),-88 = (10101000),做無符號減法,顯然產生借位,故CF = 1
        ;-(00001100) = 11110100 = 0F4H
  6. 乘除法指令

    • 乘法(MUL/IMUL)

      • 若爲字節乘法(8位),結果送入AX,若爲字乘法(16位),結果送入DX:AX

      • 乘法操作目的操作數爲隱含的,源操作數不能爲立即數

      • 當高位結果不爲0時,CF = OF = 1

      • 若爲IMUL 2操作數指令,只要求目的操作數爲寄存器,源操作數和目的操作數同規模

      • 若爲IMUL 3操作數指令,要求去上述相同,第三操作數爲立即數

      • 有符號乘法,高位未必是乘積的符號擴展

        MOV AX, 0
        MOV BL, 10
        MOV AL, 9CH
        IMUL BL     ; AX = 0FC18H
    • 除法(DIV/IDIV)

      • 商存低位,餘數存高位
      • 對標誌寄存器無定義,除數爲0或商溢出,自動中斷退出程序。
    • 符號擴展指令

      • 說明:一般出現在除法操作前的預處理中
      • 例子
        1. 計算(X + 125 - X * Y) / Z,其中X、Y、Z爲16位帶符號字變量,商存入X,餘數存入Y
          MOV AX, X
          IMUL Y
          MOV CX, AX
          MOV BX, DX
          
          MOV AX, X
          ADD AX, 125
          CWD
          
          SUB AX, CX
          SBB DX, BX
          
          IDIV Z
          MOV X, AX
          MOV Y, DX
  7. 邏輯運算指令

    • 常用操作
      • 清零(清CF標誌)
        XOR AX, AX
      • 加 30H(數字的ASCII碼變化)
        OR AL, 30H
  8. 移位指令

    • SHL/SHR
      • 格式:SHL/SHR DST, COUNT
      • 說明:左移/右移count位
  9. 比較指令
    實際內容爲減法,詳見第五章筆記。

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