之前的笔记搬运
16位寄存器:
1. 通用寄存器
ax: (add)累加器, 使用频率最高, 被特殊优化的寄存器, 一般用于存放运算结果;
bx: (base)基址寄存器, 一般用于放某结构的首地址, 如数组,结构体等等;
cx: (count)计算器, 一般用于循环等其他需要计数操作的寄存器;
dx: (data)数据寄存器, 用于和其他寄存器组合表示大于一个寄存器的数值;
si: (source)源变址寄存器, 一般用于存放内存拷贝的源地址
di: (destination)目标变址寄存器, 一般用于存放内存拷贝的目标地址
sp(Stack Pointer): 一般指向栈顶
bp(basePointer): 一般指向栈低
2. 专用寄存器
ip: 指令指针寄存器, 一般和段寄存器联用来确定下一条指令的物理地址;
3. 标志位器
状态标志:
CF ZF SF PF OF AF
控制标志:
DF IF TF
各个标志位的作用:
1 | ZF |
TF被设置位1时,CPU进入单步模式,所谓单步模式就是CPU在每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令。
在Debug中标志位 0与1的表示:
标志位 | =1 | =0 |
---|---|---|
ZF | ZR[Zero] | NZ[Not Zero] |
PF | PE[Parity Even] | PO[Parity Odd] |
SF | NG[Negative] | PL[Plus] |
CF | CY[Carry] | NC[No Carry] |
OF | OV[Overflow] | NV[Not Overflow] |
AF | AC[Auxiliary Carry] | NA[No Auxiliary Carry] |
DF | DN[Down] | UP[UP] |
IF | EI[Enable Interrupt] | DI[Disable Interrupt] |
4.段寄存器
8086CPU有20根地址线,最大可寻址内存空间为1MB。而8086的寄存器只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为2\^4,即16个段,每段不超过64KB(2\^16,16位数据线就可以寻址)。在8086中设置4个16位的段寄存器,用于管理4种段:CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。把内存分段后,每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址。
段超越前缀指令
没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段
默认的情况允许改变,需要使用段超越前缀指令;8086指令系统中有4个:
CS: ;代码段超越,使用代码段的数据
SS: ;堆栈段超越,使用堆栈段的数据
DS: ;数据段超越,使用数据段的数据
ES: ;附加段超越,使用附加段的数据
没有段超越的指令实例:
MOV AX,[2000H] ;
从默认的DS数据段取出数据
AX←DS:[2000H];
采用段超越前缀的指令实例:
MOV AX,ES:[2000H] ;
从指定的ES附加段取出数据
AX←ES:[2000H];
段寄存器的使用规定
访问存储器的方式 | 默认 | 可超越 | 偏移地址 |
---|---|---|---|
取指令 | CS | 无 | IP |
堆栈操作 | SS | 无 | SP |
一般数据访问 | DS | CS ES SS | 有效地址EA |
BP基址的寻址方式 | SS | CS ES DS | 有效地址EA |
串操作的源操作数 | DS | CS ES SS | SI |
串操作的目的操作数 | ES | 无 | DI |