寄存器与内存访问

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要读写内存时:
  1. CPU中的相关组件提供两个16位地址,一个为段地址,一个为偏移地址
  2. 段地址和偏移地址通过内部总线送入一个成为地址加法器的部件;
  3. 地址加法器将两个16位地址合为20位物理地址
  4. 地址加法器通过内部总线将20位物理地址送入输入输出控制电路
  5. 输入输出控制电路将20位物理地址送入地址总线
  6. 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=0003HCPU将由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只知道栈顶在何处,而不知到我们安排的栈空间有多大。

你可能感兴趣的:(寄存器与内存访问)