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微处理器中,有些寄存器组合在一起使用是出于特定的寻址模式、数据传输或运算目的。以下是一些默认一起使用的寄存器组合:

  1. 段寄存器与数据/地址寄存器

    • 数据段寄存器 DS数据寄存变址寄存器 组合,用于访问内存中的数据。在默认情况下,大多数内存操作数的寻址会隐式使用DS段寄存器作为前缀,除非显式指定其他段寄存器(如ES、SS等)
    • 堆栈段寄存器 SS堆栈指针寄存器 SP 组合,用于栈操作。PUSHPOPPUSHFPOPFCALLRET等指令会自动结合SS和SP来寻址栈顶元素
    • 附加段寄存器 ES数据寄存器或变址寄存器 组合,用于访问额外的数据区域,特别是进行字符串操作时(如MOVS, CMPS, STOS, LODS等指令),默认使用ES作为段寄存器
  2. 基址寄存器(BX或BP)与变址寄存器(SI或DI)

    • 在基址加变址寻址模式中,基址寄存器(BX或BP)和变址寄存器(SI或DI)一起使用,形成复杂寻址方式,用于访问内存中相对于某个基址和变址偏移量的位置。例如:

      1
      MOV AL, [BX+SI] ; 基于BX和SI的偏移寻址内存数据
  3. 指令指针寄存器 IP 与代码段寄存器 CS

    • IP 和 CS 一起构成了当前指令的完整逻辑地址(物理地址 = CS × 16 + IP)。虽然它们在编程中不直接作为一对来操作,但在硬件层面始终是一起工作的,以确定下一条要执行的指令所在的位置

各个段的访问

不可修改的寄存器:

  1. 指令指针寄存器(Instruction Pointer, IP):
    • 不可直接修改:IP寄存器存储了下一条要执行指令的偏移地址,它不能直接通过MOV指令赋值。IP的修改通常由转移(jump)指令、调用(call)指令、中断处理(interrupt handling)等自动完成,这些指令会根据需要自动更新IP的值。
  2. 代码段寄存器(Code Segment, CS):
    • 间接影响IP:与IP类似,上述转移指令、调用指令或者系统级操作(如任务切换、中断处理等)间接完成,这些操作会同时更新CS和IP
  3. 栈段寄存器(Stack Segment, SS)和堆栈指针寄存器(Stack Pointer, SP):
    • 通常不单独修改:虽然SS和SP寄存器可以被MOV指令修改,但在实际编程中,通常不会直接对SS赋值,而是通过POPPUSHCALLRET等指令间接修改SP,同时这些指令也会隐含地影响SS(如果需要切换栈段)

请注意,上述“不可直接修改”或“通常不单独修改”指的是通过常规的MOV指令直接赋值,而不是指这些寄存器在运行过程中永远不变。实际上,它们的值会随着程序的执行和特定指令的操作而动态变化

各个段在内存的分布情况:

  • 代码段:通常位于内存的低地址区域(向下增长)

  • 数据段:通常紧邻代码段下方,存放已初始化的全局变量、静态变量和常量

  • 堆栈段:通常位于内存的最高地址区域,其底部不断增长(向上增长)

  • 附加段本身不是一个独立的内存区域,而是一个段寄存器,它存储的是一个内存段的地址。可以在程序中动态设定ES寄存器的值,使其指向任何已分配且合适的内存区域

概括来说,代码段、数据段、堆栈段在内存中的相对位置大致如下:

1
2
3
4
5
6
7
8
9
10
11
低地址   ---------------------------- 
| |
| 代码段 |
| |
|--------------------------|
| 数据段 |
|--------------------------|
| ... |
|--------------------------|
| 堆栈段(向上增长) |
高地址 ----------------------------