目录
微处理器的外部结构
微处理器的内部结构
8086的寄存器
8086内部有14个16位的寄存器。
按功能分为:
- 8个通用寄存器(AX,BX,CX,DX;SI,DI,SP,BP)
- 4个段寄存器
- 2个控制寄存器
通用寄存器(8个)
通用寄存器可以分为两类:数据寄存器(AX、BX、CX、DX)和地址指针/变址寄存器(SI、DI、SP、BP、)
数据寄存器
- 累加器AX(accumulator):最常用的寄存器。乘法和除法操作只能在AX中完成。
- 基址寄存器BX(base register):虽然属于数据寄存器,但它经常用作地址寄存器。
- 计数寄存器CX(count register):经常用作循环的计数寄存器,例如在循环语句中,默认CX的内容为循环次数。
- 数据寄存器DX(data register):用于寄存数据,但在I/O指令中,DX用于表示端口地址。
这4个16位数据寄存器按照字节高低可以分为8个8位寄存器。
AX→AH,AL;BX→BH,BL;CX→CH,CL;DX→DH,DL
地址指针/变址寄存器
- 变址寄存器SI(source index):在字符串操作指令中,SI提供源操作数的段内偏移地址,在其他指令中,用作地址寄存器。
- 变址寄存器DI(destination index):在字符串操作指令中,DI提供目的操作数的段内偏移地址,在其他指令中,用作地址寄存器。
- 堆栈指针SP(stack pointer):用于保存堆栈段的段内偏移地址。
- 基址指针BP(base pointer):BP可以指定段内偏移地址,但将BP用作地址寄存器时,一般情况下,其默认段地址为SS。
物理地址=段地址×10H+偏移地址
段寄存器(4个)
- 代码段寄存器CS(code segment):用于存放当前执行程序的段地址,IP为指令指针。
- 数据段寄存器DS(data segment):用于存放当前数据段的段地址。
- 附加段寄存器ES(extra segment):用于存放当前附加数据段的段地址。
- 堆栈段寄存器SS(stack segment):用于存放当前堆栈段的段地址。
控制寄存器(2个)
-
指令指针IP (instruction pointer):也称程序计数器PC(program counter),用于保存下一条即将要执行指令的段内偏移地址。
-
微处理器状态字PSW(processor state word):16位寄存器,共设定了9个标志位,其中6个标志位(CF,PF,AF,ZF,SF,OF)用于反应ALU前一次操作的结果状态,3个标志位(DF,IF,TF)用于控制CPU操作。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 反应ALU前一次操作结果状态的标志位
- 进位标志CF(carry flag):在加减运算时,最高位(D7或D15)有进(借)位时为1
- 奇偶标志PF(parity flag):低8位中含有“1”的个数为偶数时为1
- 辅助进位标志AF(auxiliary carry flag):在加减运算时,D3位有进(借)位时为1
- 零标志ZF(zero flag):运算结果为0时为1
- 符号标志SF(sign flag):最高位(D7或D15)的值
- 溢出标志OF(overflow flag):有符号数运算溢出时为1
进位标志CF表示无符号数运算结果是否超出范围,运算结果仍然正确。
溢出标志OF表示有符号数运算结果是否超出范围,运算结果已经不正确。
判断溢出的简单方法
只有当两个相同符号数相加(正数+正数,负数+负数),或者不同符号数相减,而运算结果的符号与原数据符号相反时,产生溢出。
其他情况不会产生溢出。
也就是说OF可以依据操作数和结果数的最高位进行判断。
控制CPU的标志位
-
方向标志DF(direction flag):
在字符串操作中,当DF=0时,SI、DI的内容自动递增;DF=1时,DI、DI自动递减。
-
中断允许标志IF(interrupt enable flag):
IF=1:CPU能响应中断请求
IF=0:CPU不能响应中断强求
-
陷阱标志TF(trap flag):
TF=1:CPU处于单步执行方式,即每执行一条指令就自动执行一次类型1的内部中断,主要用在debug中。
物理地址的计算方法
物理地址 = 段地址+偏移地址 = 段寄存器内容×16+偏移地址取指令物理地址 = (CS)×16+(IP)
堆栈操作物理地址=(SS)×16+(SP)/(BP的表达式)
存储器操作数物理地址=(DS)/(ES)×16+偏移地址