1. 总线

总线分为地址总线, 数据总线和控制总线.

  • n根地址总线可以寻址 \$2^n\$个内存单元.

  • n根数据总线可以一次性传输 \$n/8\$个字节的数据.

  • 控制总线的宽度决定了CPU对外部器件的控制能力.

2. CPU

2.1. 内存地址

对于16位CPU, 物理地址 = 段地址 * 16 + 偏移地址.
一个段的长度最大为64KB(偏移地址数量).

2.2. 寄存器

2.2.1. 数据寄存器

AX BX CX DX

每个寄存器都可以分为*H和*L, 各代表高低8位.

2.2.2. 段寄存器

提供内存单元的段地址

CS DS SS ES

8086CPU不支持将数据直接送入到段寄存器, 只能送入一个数据寄存器/内存空间的值.
段寄存器的值可以送入到数据寄存器/内存空间中.

2.2.3. 指令指针寄存器

保存下一条将要指定的指令地址.

IP

使用jmp修改IP寄存器的值:
  • jmp <cs>:<ip>. 段间偏移 jmp FFFFH,3

  • jmp <ip>. 段内偏移 jmp ax

2.3. 指令执行流程

  1. CPU从 \$CS*16+IP\$ 中读取指令, 读取到的指令放入指令缓冲器.

  2. IP+=读取到的指令长度.

  3. 执行指令.

  4. 重复步骤1.

CS初始值0xFFFFH, IP初始值0x0000H,内存单元0xFFFF0H保存第一条要被执行的指令地址.

2.4. 栈寄存器

SS:SP指向栈顶元素, push和pop指令执行时, CPU从SS和SP中得到栈顶地址.

3. 指令

3.1. 伪指令

assume cs:demo ;伪指令, 将demo的段地址送入cs
demo segment
 mov ax,0
demo ends
end

3.2. bx

表示将bx寄存器中的值作为一个偏移地址
mov ax,[bx] : ds:bx 中的值送入到ax中

si,di功能与bx相同, 但不能分为两个8位的寄存器来使用.

3.3. loop

CPU执行loop指令的时候,要进行两步操作:
. (cx) = (cx) - 1
. 判断cx中的值,如果不为0则转至标号处执行程序, 如果为0则向下执行.

计算 \$2^12\$
assume cs:code
code segment

    mov ax,2
    mov cx,11
s:  add ax,ax
    loop s

    mov ax,4c00H
    int 21H
code ends
end

3.4. 逻辑指令

and ax,10000000B ;后面7位置为0
or ax,10000000B ;最高位置为1

3.5. 转移指令

  • 无条件转移指令

  • 条件转移指令

  • 循环指令

  • 过程

  • 中断

3.6. 定义数据类型

  • db: 字节型数据

  • dw: 字型数据

  • dd:
    双字型数据

指定指令处理的数据长度: mov word/byte ptr xx,xx | mov al,xx

3.7. 定义重复数据

  • dd 重复次数 dup (重复数据)

dd 3 dup (0) === dd 0,0,0
dd 3 dup (0,1,2) === dd 0,1,2,0,1,2,0,1,2
dd 3 dup ('abc','ABC') === dd 'abcABCabcABCabcABC'

4. 寻址方式

  • 直接寻址

    • [idata]

  • 寄存器间接寻址

    • [bx]

    • [si]

    • [di]

    • [bp]

  • 寄存器相对寻址

    • [bx+idata]

    • [si+idata]

    • [di+idata]

    • [bp+idata]

  • 基址变址寻址

    • [bx+si]

    • [bx+di]

    • [bp+si]

    • [bp+di]

  • 相对基址变址寻址

    • [bx+si+idata]

    • [bx+di+idata]

    • [bp+si+idata]

    • [bp+di+idata]