2.1 通用寄存器
8086CPU的所有寄存器都是16
位,可以存放两个字节。AX、BX、CX、DX
通常用来存放一般性的数据,被称为通用寄存器。
以上都可以分为xH,xL
2.3 几条汇编指令
汇编指令 | 语法描述 |
---|---|
mov ax, 18 | AX=18 |
mov ah, 18 | ah=18 |
add ax,8 | ax=ax+8 |
mov ax, bx | ax=bx |
add ax, bx | ax=ax+bx |
2.4 物理地址
每个内存单元在这个空间都有唯一的地址,成为物理地址。
CPU通过地址总线送入存储器,必须是一个内存单元的物理地址。
2.5 16结构的CPU
16位结构描述了一个CPU具有的特性:
- 运算器一次最多处理16位数据
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路为16位
2.6 8086CPU给出物理地址的方法
8086CPU
有20位地址总线,可以传送20位地址,达到1MB
的寻址能力。
8086CPU
要读写内存时:
- CPU中的相关组件提供两个16位地址,一个为段地址,一个为偏移地址
- 段地址和偏移地址通过内部总线送入一个成为地址加法器的部件;
- 地址加法器将两个16位地址合为20位物理地址
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路
- 输入输出控制电路将20位物理地址送入地址总线
- 20位物理地址被地址总线传送到存储器
地址加法器:
物理地址 = 段地址 x 16 + 偏移地址
2.8 段的概念
其实内存并没有分段,段的划分来自于CPU。借助 段地址来确定段的起始地址,偏移地址的长度代表了段的寻址能力。
2.9 段寄存器
8086CPU
要访问内存时,由某些寄存器提供内存单元的段地址。这个CPU
提供了4个段寄存器:CS、DS、SS、ES
。
2.10 CS和IP
CS为代码段寄存器,IP为指令指针寄存器。
8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行
2.11 修改CS、IP的指令
jmp
段地址:偏移地址
jmp 2AE3:3
执行后:CS=2AE3H,IP=0003H
,CPU
将由2AE33H处读取指令
jmp ax :mov IP,ax
第三章 寄存器(内存访问)
3.1 内存中字的存储
字节型数据:8位
字形数据:16位
内存单元时字节单元
3.2 DS与[address]
8086CPU
有一个DS寄存器
,通常用来存放要访问数据的段地址。
如:
mov bx, 1000H
mov ds, bx
mov al,[0]
上面指令将10000H(1000:0)
中的数据读到al
中。
[...]
表示一个内存单元,[...]
中的0
表示了内存单元的偏移地址。另外,8086CPU
会自动取ds
中的数据为内存单元的段地址。ds数据段寄存器
不支持直接将数据送入里面的操作,需要通过一个寄存器来中转一下。
3.3 字的传送
假如内存单元为:
地址 | 数据 |
---|---|
10000H | 23 |
10001H | 11 |
10002H | 22 |
10003H | 11 |
指令执行与寄存器中的内容:
指令 | 执行后相关寄存器或内存单元中的内容 | 说明 |
---|---|---|
mov ax, 1000H | ax=1000H | |
mov ds,ax | ds=1000H | 这两条指令的目的时将ds设为1000H |
mov ax,11316 | ax=2C34H | |
mov [0], ax | 1000H 34 10001 2C | 高八位在高地址,低八位在地址 |
mov bx, [0] | bx=2C34 | |
sub bx, [2] | bx=2C34H-1122H=1B12H | |
mov [2],bx | 1002H 12 1003H 1B |
3.4 mov、add、sub指令
如:
- mov 段寄存器, 寄存器
- mov 内存单元, 寄存器
- mov 寄存器,内存单元
3.5 数据段DS
我们将一组长度为N(N<=64KB 8086为16位)
、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义一个数据段。
3.6 栈
LIFO(Last In First Out)
3.7 CPU提供的栈机制
8086CPU提供了入栈和出栈指令,最基本的是PUSH和POP,这两个操作都是以字为单元进行了。
mov ax, 0123H
push ax
mov bx, 2266H
push bx
8086CPU
有两个寄存器,栈寄存器SS和寄存器SP
,栈顶的段地址存放在SS
中,偏移地址存放在SP
中。
任意时刻:SS:SP
指向栈顶元素。
3.8 栈顶越界问题
8086CPU不保证我们对栈的操作不会越界,8080CPU只知道栈顶在何处,而不知到我们安排的栈空间有多大。