白乐天

道阻且长,行则将至。

8086汇编

寄存器

8086CPU中有14个寄存器,分别是AX、BX、CX、DX、SI、DI、BP、SP、IP、CS、SS、DS、ES、PSW。

1
2
3
4
5
6
7
通用寄存器:AX、BX、CX、DX
变址寄存器:SI、DI
指针寄存器:BP、SP
指令指针寄存器:IP
段寄存器:CS、SS、DS、ES //ES:附加段寄存器
标志寄存器:PSW
8086CPU所有的寄存器都是16位的,可以存放2个字节

通用寄存器

以AX为例

一个16位寄存器可以存储一个16位的数据,它可以存储的最大值为2的16次方减1(65535)。

为保证兼容这四个通用寄存器都可分为两个独立使用的8位寄存器来使用:

16位 高8位 低8位
AX AH AL
BX BH BL
CX CH CL
DX DH DL

段寄存器

段寄存器用来存放段地址。

8086CPU有4个段寄存器:CS、DS、SS、ES。这四个段寄存器提供内存单元的段地址。

CS和IP

CS和IP是8086CPU中两个最关键的寄存器,它们指示 了CPU当前要读取指令的地址。

CS为代码段寄存器,IP为指令指针寄存器,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行。

DS和[address]

在8086CPU中,内存地址由段地址和偏移地址组成,读写一个内存单元的时候,必须先给出这个内存单元的地址。

1
2
用DS寄存器存放要访问的数据的段地址
偏移地址用[...]形式直接给出

SS和SP

栈顶的段地址存放在存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。

栈操作机制:

1
2
3
4
5
6
7
push 指令执行步骤
SP=SP-2;
向SS:SP指向的字单元中送入数据。

pop指令的执行步骤
从SS:SP指向的字单元中读取数据
SP=SP+2

索引寄存器

si和di

SI(Source Index) 和 DI(Destination Index) 是两个16位的索引寄存器,主要用于字符串/数组操作和内存块数据传输。

代码示例

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
; 将字符串从源复制到目标
DATA SEGMENT
source DB 'Hello, 8086!', '$'
DATA ENDS

EXTRA SEGMENT
dest DB 13 DUP(?)
EXTRA ENDS

CODE SEGMENT
ASSUME DS:DATA, ES:EXTRA, CS:CODE
START:
MOV AX, DATA
MOV DS, AX ; DS指向源数据段
MOV AX, EXTRA
MOV ES, AX ; ES指向目标数据段

LEA SI, source ; SI = 源地址
LEA DI, dest ; DI = 目标地址
MOV CX, 12 ; 复制12个字符
CLD ; DF=0,地址递增
REP MOVSB ; 逐个字节复制

; 结束程序
MOV AH, 4CH
INT 21H
CODE ENDS
END START

内存与数据

内存单元的描述

要完整的描述一个内存单元,需要两种信息:

  • 内存单元的地址
  • 内存单元的长度(类型)

不同的寻址方式

数据的处理

处理数据要清楚数据在内存中的位置和要处理的数据的长度

指令

ADD

1
ADD 目标操作数, 源操作数	;目标操作数 = 目标操作数 + 源操作数

SUB

1
SUB 目标操作数, 源操作数	;目标操作数 = 目标操作数 - 源操作数