汇编学习笔记 第三章

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. 比较指令
    实际内容为减法,详见第五章笔记。

你可能感兴趣的:(汇编,汇编笔记)