未命名

第3章 8086汇编

常用指令

  • 数据传送

    • mov destination,source : 两个操作数不能同时为内存、目的操作数不能是 CS,IP、立即数不能送至段寄存器

      1
      2
      mov r/m16,sreg
      mov sreg,r/m16
  • 逻辑运算

    • AND 目的,源:按位与,某一位或某些位置 0

    • OR:置 1

    • NOT reg/mem 操作数所有数据位取反

    • XOR

      • 对某些位取反,同时不影响其他位(哪些为置1,就对哪些为取反)两次异或之后还是原来的数

      • 判断 16 位值的奇偶性

        1
        2
        mov ax,64C1h	; 0110 0100 1100 0001
        xor ah,al ; PE,奇偶标志被设置
      • 简单数据加密:将某个操作数与同样的操作数执行两次异或运算后,其值保持不变。

  • 移位

    • SHL : 逻辑左移:低位补0,最高位移动到 CF
    • SHR:逻辑右移 :高位补 0,最低位移动到 CF
    • ROL:循环左移:最高位同时移动到 CF 和最低位
    • ROR:循环右移:最低位同时移动到 CF 和最低位
    • SAL:算术左移:低位补0,最高位移动到 CF
    • SAR:算术右移:最高位不变
  • 算术运算

    • DAA:将 ADD 或 ADC 指令执行后 AL 的结果转换成压缩的 BCD 格式

    • DAS:将 SUB 或 SBB 指令执行后 AL 的结果转换成压缩的 BCD 格式

      1
      2
      3
      4
      5
      6
      7
      8
      mov al,35h
      add al,48h ; AL = 7Dh
      daa ; AL = 83h

      mov bl,48h
      mov al,85h
      sub al,bl ; AL = 3Dh
      das ; AL = 37h
    • ==MUL==

      MUL r/m8 MUL r/m16,给出一个操作数,另一个操作数隐含寻址

      被乘数 乘数 CF=1的条件
      AL r/m8 AX AH≠0
      AX r/m16 DX:AX DX≠0
      EAX r/m32 EDX:EAX EDX≠0
    • ==DIV==

      被除数 除数 余数
      AX r/m8 AL AH
      DX:AX r/m16 AX DX
      EDX:EAX r/m32 EAX EDX
  • 堆栈

    • PUSH、POP
  • 程序控制

    • CALL、RET

    • INT

    • LOOP

    • TEST

    • CMP

    • Jcond Z 零、C 进位、O溢出、S符号、P奇偶

      助记符 描 述 标志值
      JZ 为零则跳转 ZF=1
      JNZ 不为零则跳转 ZF=0
      JC 如果设置进位标志则跳转 CF=1
      JNC 如果未设置进位标志则跳转 CF=0
      JO 如果设置溢出标志则跳转 OF=1
      JNO 如果未设置溢出标志则跳转 OF=0
      JS 如果设置符号标志则跳转 SF=1
      JNS 如果未设置符号标志则跳转 SF=0
      JP 如果设置了奇偶标志则跳转(偶) PF=1
      JNP 如果未设置奇偶标志则跳转(奇) PF=0

      无符号整数比较结果:大于A 、小于 B

      助记符 描 述
      JA 大于则跳转(leftOp>rightOp)
      JNBE 不小于或等于则跳转(同JA指令)
      JAE 大于或等于则跳转(leftOp≥rightOp)
      JNB 不小于则跳转(同JAE指令)
      JB 小于则跳转(leftOp<rightOp)
      JNAE 不大于或等于则跳转(同JB指令)
      JBE 小于或等于则跳转(leftOp≤rightOp)
      JNA 不大于则跳转(同JBE指令)

      有符号整数比较结果:大于 G、小于 L

      助记符 描 述
      JG 大于则跳转(leftOp>rightOp)
      JNLE 不小于或等于则跳转(同JG指令)
      JGE 大于或等于则跳转(leftOp≥rightOp)
      JNL 不小于则跳转(同JGE指令)
      JL 小于则跳转(leftOp<rightOp)
      JNGE 不大于或等于则跳转(同JL指令)
      JLE 小于或等于则跳转(leftOp≤rightOp)
      JNG 不大于则跳转(同JLE指令)
  • 输入、输出

    • IN、OUT

      • IN:从端口读入一个字节、字

      • OUT:向端口输出一个字节、字

        1
        IN AL\AX, 端口地址

        l端口地址:0~FFh 之间的一个常量,或是包含 0~FFFFh 之间的值的DX 寄存器。

常用伪指令、操作符

  • 定义变量类型:

    DB:定义八位无符号整数 (BYTE)

    DW:定义 16 位无符号整数

  • OFFSET:

    • 返回数据标号的偏移地址(标号距数据段开始的距离,以字节为单位)。
  • SEG + 符号:

    • 取符号所在段的起始地址的高16位
  • PTR:

    用来重载操作数的默认尺寸

    1
    2
    3
    4
    5
    6
    7
    .data
    myDouble DWORD 12345678h
    .code
    mov ax, myDouble ; 错误
    mov ax, WORD PTR myDouble ; ax = 5678h
    mov ax, WORD PTR [myDouble+2] ; ax = 1234h
    mov bl, BYTE PTR myDouble ; bl = 78h
  • SIZEOF + 数组首地址符号

    返回标号定义的数据所占用的字节数 (=LENGTHOF返回值×TYPE返回值)

常用寻址方式

  • 立即寻址、直接寻址、寄存器寻址
  • 寄存器间接寻址:[BX]、[SI]、[DI]
  • 寄存器相对寻址:用于查表
    • TAB[BX]、TAB[SI]、TAB[DI]
    • [TAB+BX]、[TAB+SI]、[TAB+DI]
  • 基址变址寻址:
    • [BX][SI]、[BX][DI]
    • [BX+SI]、[BX+DI]
  • 相对基址变址寻址:
    • TAB[BX][SI]、TAB[BX][DI]
    • TAB[BX+SI]、TAB[BX+DI]
    • [TAB+BX+SI]、[TAB+BX+DI]

程序框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
STACK  SEGMENT STACK

DB 100 DUP(0)

STACK ENDS

DATA SEGMENT

NUM8 DB 16,25

NUM16 DW 36,64

ARRAY8 DB 20 DUP(0)

……… …………

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START: MOV AX,DATA

MOV DS,AX

…………

MOV AX,4C00H

INT 21H

CODE ENDS

END START

子程序结构

1
2
3
4
5
6
7
8
9
10
11
     ……
CALL SUB1
……

SUB1 PROC
PUSH …
……
POP …
RET

SUB1 ENDP