早期的8086cpu中共有14个寄存器: 分别为:AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 按照功能来分,大致可分为三类
1、通用寄存器
数据寄存器
AX
Accumulator:累加寄存器,也称之为累加器,常用于存放算术、逻辑运算中的操作数或结果。另外,所有的外部设备的输入输出指令都只能使用AL或AX作为数据寄存器。
BX
BX (Base):基地址寄存器,可用于数据寄存器,访问存储器时、可以存放被访问内存的地址,是具有双重功能的寄存器
CX
CX (Count):计数器寄存器;在循环、串操作指令中用作计数器。如在loop循环中用作计数器。
DX
DX (Data):数据寄存器;在乘除法中作为数据累加器,在输入输出操作中存放端口的地址。此外,在做双字长乘除法运算时,DX 与AX合起来存放一个双字长数(32位),其中DX存放高16位(余数),AX存放低16位(商)。
指针寄存器
SP
Stack Pointer:堆栈指针寄存器,存放栈顶的偏移位置,供堆栈操作使用,常用SS搭配进行使用
BP
Base Pointer:基指针寄存器;存放堆栈内数据的基地址
变址寄存器
SI
Source Index:源变址寄存器;主要用于存放地址,在字符串操作中存放源操作数的偏移地址。变址寄存器内存放 的地址在数据传送完成后,具有自动修改的功能。
DI
Destination Index:目的变址寄存器;主要用于存放地址,在字符串操作中存放目的操作数的偏移地址。
2、控制寄存器
IP
IP(Instruction Pointer):指令指针寄存器,常与CS进行配合使用,用于共同寻址。
FLAG
标志寄存器
3、段寄存器
- CS(Code Segment):代码段寄存器
- DS(Data Segment):数据段寄存器
- SS(Stack Segment):堆栈段寄存器
- ES(Extra Segment):附加段寄存器
CS:代码段寄存器
基本概念解释
CS,代码段寄存器常与IP(指令指针寄存器)共同使用,指示cpu当前将要读取的指令的地址。
那么cpu如何知晓该执行指令的地址呢?
当我们运行一个可执行文件时,我们需要另外一个程序来将这个可执行文件加载到内存当中,
一般是通过操作系统的外壳程序(也就是 Shell 程序),
Shell 将可执行文件加载到内存中以后,就会设置 CPU 中的两个寄存器,即设置 CS:IP 两个寄存器指向可执行文件的起始地址,此后 CPU 便从这个起始地址开始读取内存中的指令,并且执行。
start作用
start用于标记可执行文件的起始地址。
DS:数据段寄存器
DS,全称:Data Segment register,为数据段寄存器,其作用主要用于访问内存中的数据,常与偏移地址共同使用,那么ds的作用是什么呢?通俗点来说就是寻找数据。cpu要读写一个内存单元时,必须要知晓这个内存单元在哪,因此便可以通过ds(数据段寄存器)和偏移地址两个参数,来确定这个内存单元在哪。
访问内存中的数据的方式
方式一:段地址(ds):[偏移地址] 方式二:[偏移地址],等同于ds:[偏移地址]
需要注意 在访问内存中数据的时候,段地址不能直接写数值而必须由段地址寄存器来提供,比如:
mov ax 3423h
mov 1000h:[0h] ,ax
而正确的写法
mov ax, 3423h
mov bx, 1000h
mov ds,bx
mov ds:[0], ax
DS常见的误用
段寄存器是不支持将数据直接写入的,而是需要借用其他寄存器将数据写入: 如:
mov ds,1000h
mov bx,1000h
mov ds,bx
SS
堆栈寄存器,一般作为栈和sp搭档,其中ss用作堆栈段的首地址,sp用于堆栈段的偏移地址。 当放入数据时,sp应当先进行移位,再放入数据;当释放数据时,应当先释放数据,sp再进行移位。
ES
扩展段寄存器。
总结
每个寄存器都是16位的,即dword双字节,除了数据寄存器外的寄存器均不可分为两个8位的寄存器使用。
|