2. 寄存器
寄存器进行信息的存储,对于汇编程序员来说,CPU 中的主要部件是寄存器。8086CPU
有 14
个寄存器,这些寄存器分别是:
AX BX CX DX SI DI SP BP IP CS SS DS ES PSW
通用寄存器
8086所有的寄存器都是 16 位的,可以存放两个字节。下面所有的描述都是基于 8086,不再赘述。
通用寄存器通常用来存放一般性的数据。下面是四个通用寄存器:
AX、BX、 CX、 DX
16位寄存器的逻辑结构:
一个 16 位的存储器可以存储一个16位的数据,存储的数据范围为(2^0 ~ 2 ^ 16 - 1 )
每个寄存器都可以分为两个独立的 8 位寄存器来使用。AX
可以分为 AH
和 AL
ax 的低八位(0-7)构成了al寄存器,高八位(8-15)构成了ah寄存器。
字的存储
字节:byte
,一个字节由 8 个 bit
组成,可以存在 8 位寄存器中。
字:word
一个字由两个字节组成,可以分为高位字节和低位字节。
一个字可以存在一个 16 位寄存器中。
mov ax, 18 //将18送入寄存器ax
mov ah, 78 //将78送入寄存器ah
add ax,8 //将寄存器ax中的数值加上 8
注意:在写一条汇编指令或者一个寄存器的名称时不区分大小写。
在进行数据传送或者运算的时候,要注意指令的两个操作对象的位数应当是一致的。8 位 和 16 位一定不要混用。
// 以下全是错误指令
mov ax,bl
mov bh,ax
mov al,20000
add al, 100H
物理地址
每一个内存单元在空间中都有一个唯一的地址,这个唯一的地址就是物理地址。
16位结构的描述了一个 CPU 具有如下结构特性:
- 运算器一次最多可以处理 16 位数据
- 寄存器的最大宽度是 16 位
- 寄存器和运算器之间的通路为 16 位。
8086 CPU 可以一次性传送 20
位地址,寻址能力为 1 MB
采用一种在内部用两个16位地址合成的方法来形成一个 20 位的物理地址。
8086 CPU 提供两个 16 位的地址,一个是 段地址,一个是偏移地址。
过程:
段地址+偏移地址 =》地址加法器 =》输入输出控制电路 =》通过地址总线传送到内存
地址加法器采用 物理地址 = 段地址 * 16 + 偏移地址 的方法合成物理地址。
本质含义:CPU 在访问内存的时候,用一个基础的地址(段地址*16)和一个相对基础地址的偏移地址相加,给出内存单元的物理地址。
更一般的说法 :物理地址 = 基础地址 + 偏移地址
段地址 1230 段地址*16 12300 相加获得物理地址:123C8H
偏移地址 00C8 偏移地址 00C8
小技巧:一个 X 进制的数据左移一位,相当于乘以 X
段寄存器
段并不是把内存单元划分成了一个一个的段。其实内存并没有划分成段,段的划分来自 CPU ,用上述的方式来给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
注意两单:段地址*16 必然是16的倍数,所以一个段的起始地址一定是16的倍数;偏移地址位16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
有四个段寄存器: CS、DS、SS、ES
本节我们重点看一下 CS
CS
和 IP
指示了 CPU 当前要 读取指令 的地址。CS
为代码段寄存器 IP
为指令指针寄存器。
设 CS
的地址为 M , IP
中的地址为 N ,8086 CPU将从内存 M * 16 + N单元开始,读取一条指令并执行。
Q:CPU 根据什么将内存中的信息看作指令?
A:CPU 将 CS : IP
指向的内存单元中的内容看作指令。
修改 CS 、IP 的指令
如果想同时修改 CS IP
的指令,需要用 jmp 段地址:偏移地址
上述指令的功能位:用指令中给出的段地址修改CS
偏移地址修改 IP
如果仅想修改 IP
的内容,可用形如 jmp 某一寄存器
的指令完成.。