• 寄存器

    • 通用寄存器
      AX (accumulate累加寄存器);
      BX(base基地址寄存器);
      CX(count计数器寄存器);
      DX(data数据寄存器)。
  • 指针寄存器
    SP(stack pointer堆栈指针寄存器)
    BP(base pointer基地址寄存器)

  • 变址寄存器
    SI(source index源地址寄存器)
    DI(destination index目标变址寄存器)

  • 控制寄存器
    IP(instruction pointer指令指针寄存器)
    FlAG标志寄存器

  • 段寄存器
    CS(code segment代码段寄存器)
    DS(data segment数据段寄存器)
    SS(stack segment堆栈段寄存器)
    ES(extra segment附加段寄存器)

为了和8位机兼容,通用寄存器,可以分为高8位和低8位。如AX可以分为AH和AL。

  • 8086CPU可以一次处理两种尺度的数据,字节(8 bit)和字(16bit)。在数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。

  • 8086CPU物理地址的标识方法
    8086CPU是16位的,它的寄存器只能存储16位,但是其有20位的地址总线(寻址能力为1mb)。所以它使用段地址加偏移地址的形式来寻址。
    ABEA2V.png

地址加法器采用:物理地址=段地址*16+偏移地址。段地址可以理解为基地址。


8086使用CS寄存器和IP寄存器,来标识cpu当前要读取的指令的地址。


debug 的常用命令
-r 查看改变寄存器中的内容
-d 查看内存中的内容
-e 改写内存中的内容
-u 将内容中的机器指令翻译为汇编指令
-t 执行一条汇编指令
-a 以汇编的格式写入内存一条指令

  • 使用DS和[address]来表示一个内存单元的地址
1
2
3
mov bx,1000H
mov ds,bx
mov al,[0]

以上指令的意思是将(1000:0)地址中的数据读入al寄存器中。

1
2
3
mov ax,1234H
mov bx,1000H
mov [0],ax

以上指令的意识是将ax寄存器中的值送回地址为(1000:0)的内存中

  • 内存中一块连续的空间来作为栈。高地址为栈底。入栈时栈顶从高地址向低地址方向增长。
  • 任意时刻,[ss:sp]指向栈顶元素。
  • 栈操作都是以字为单位的
1
2
push 寄存器/段寄存器/内存单元
pop 寄存器/段寄存器/内存单元

VXslka.png

  • 汇编源程序

    • 汇编源程序包括汇编指令和伪指令
  • 定义一个段

1
2
3
4
5
XXX segment
...
...
XXX ends

  • 1
    2
    3
    4
    5
    6
    7
    8
    - ```assume```将某个段寄存器和段关联起来

    - loop指令
    格式为 ```loop 标号```;要执行两步操作(cx)=(cx)- 1;判断cx中的值,不为零则跳转到标号处执行程序

    - 在汇编源程序中,数据不能以字母开头
    - inc指令,格式为```inc bx ```.作用是加一
    - 多段汇编程序,结构
    assume cs:code
    code segment
    数据。。。
    start:
    代码。。。
    code ends
    end start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```
assume cs:code,ds:data,ss:stack

data segment
dw 0235H,0456H
data ends
stack segment
dw 0,0,0,0
stack ends
code segment
start:
代码。。

code ends
end start

段名就是段的首地址,段空间是连续的

  • 使用[bx + idata]

mov ax,[bx+200] 的含义是将ax送入段地址为ds,偏移地址为bx+200的内存中

  • 使用[bx+si]和[bx+di]
    si和di寄存器不能分为高八位和低八位

  • 寻址方式小结
    寻址方式小结