8086内部寄存器
8086内部寄存器
- AX,BX,CX,DX称为数据寄存器:
AX (Accumulator):累加寄存器,也称为累加器
BX (Base):基地址寄存器
CX (Count):计数器寄存器
DX (Data):数据寄存器
- SP和BP称为指针寄存器:
SP (Stack Pointer):堆栈指针寄存器(存放栈顶的逻辑偏移地址)
BP (Base Pointer):基指针寄存器(存放内存的逻辑偏移地址,比如调用的时候寄存)
- SI和DI又称作为变址寄存器:
SI (Source Index):源变址寄存器
DI (Destination Index):目的变址寄存器
- 控制寄存器:
IP (Instruction Pointer):指令指针寄存器
FLAG:标志寄存器
- 段寄存器:
CS (Code Segment):代码段寄存器
DS (Data Segment):数据段寄存器
SS (Stack Segment):堆栈段寄存器
ES (Extra Segment):附加段寄存器
默认寄存器的使用:
在8086微处理器中,有些寄存器组合在一起使用是出于特定的寻址模式、数据传输或运算目的。以下是一些默认一起使用的寄存器组合:
-
段寄存器与数据/地址寄存器:
- 数据段寄存器 DS 与 数据寄存变址寄存器 组合,用于访问内存中的数据。在默认情况下,大多数内存操作数的寻址会隐式使用DS段寄存器作为前缀,除非显式指定其他段寄存器(如ES、SS等)
- 堆栈段寄存器 SS 与 堆栈指针寄存器 SP 组合,用于栈操作。
PUSH
、POP
、PUSHF
、POPF
、CALL
、RET
等指令会自动结合SS和SP来寻址栈顶元素 - 附加段寄存器 ES 与 数据寄存器或变址寄存器 组合,用于访问额外的数据区域,特别是进行字符串操作时(如
MOVS
,CMPS
,STOS
,LODS
等指令),默认使用ES作为段寄存器
-
基址寄存器(BX或BP)与变址寄存器(SI或DI):
-
在基址加变址寻址模式中,基址寄存器(BX或BP)和变址寄存器(SI或DI)一起使用,形成复杂寻址方式,用于访问内存中相对于某个基址和变址偏移量的位置。例如:
1
MOV AL, [BX+SI] ; 基于BX和SI的偏移寻址内存数据
-
-
指令指针寄存器 IP 与代码段寄存器 CS:
- IP 和 CS 一起构成了当前指令的完整逻辑地址(物理地址 = CS × 16 + IP)。虽然它们在编程中不直接作为一对来操作,但在硬件层面始终是一起工作的,以确定下一条要执行的指令所在的位置
不可修改的寄存器:
- 指令指针寄存器(Instruction Pointer, IP):
- 不可直接修改:IP寄存器存储了下一条要执行指令的偏移地址,它不能直接通过
MOV
指令赋值。IP的修改通常由转移(jump)指令、调用(call)指令、中断处理(interrupt handling)等自动完成,这些指令会根据需要自动更新IP的值。
- 不可直接修改:IP寄存器存储了下一条要执行指令的偏移地址,它不能直接通过
- 代码段寄存器(Code Segment, CS):
- 间接影响IP:与IP类似,上述转移指令、调用指令或者系统级操作(如任务切换、中断处理等)间接完成,这些操作会同时更新CS和IP
- 栈段寄存器(Stack Segment, SS)和堆栈指针寄存器(Stack Pointer, SP):
- 通常不单独修改:虽然SS和SP寄存器可以被
MOV
指令修改,但在实际编程中,通常不会直接对SS赋值,而是通过POP
、PUSH
、CALL
、RET
等指令间接修改SP,同时这些指令也会隐含地影响SS(如果需要切换栈段)
- 通常不单独修改:虽然SS和SP寄存器可以被
请注意,上述“不可直接修改”或“通常不单独修改”指的是通过常规的MOV
指令直接赋值,而不是指这些寄存器在运行过程中永远不变。实际上,它们的值会随着程序的执行和特定指令的操作而动态变化
各个段在内存的分布情况:
-
代码段:通常位于内存的低地址区域(向下增长)
-
数据段:通常紧邻代码段下方,存放已初始化的全局变量、静态变量和常量
-
堆栈段:通常位于内存的最高地址区域,其底部不断增长(向上增长)
-
附加段本身不是一个独立的内存区域,而是一个段寄存器,它存储的是一个内存段的地址。可以在程序中动态设定ES寄存器的值,使其指向任何已分配且合适的内存区域
概括来说,代码段、数据段、堆栈段在内存中的相对位置大致如下:
1 |
|