本文基于16位CPU。
常用的寄存器
16位CPU寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、ES、CS、SS、DS、ES、PSW
- 4个数据寄存器(AX、BX、CX和DX)
- 2个变址寄存器(SI和DI) 2个指针寄存器(SP和BP)
- 4个段寄存器(ES、CS、SS、DS)
- 1个指令指针寄存器(IP) 1个标志寄存器(PSW)
32位CPU寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP、ES、CS、SS、DS、FS、GS、EIP、EFlags
- 4个数据寄存器(EAX、EBX、ECX和EDX)
- 2个变址寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
- 6个段寄存器(ES、CS、SS、DS、FS和GS)
- 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
32位CPU对应32位的寄存器,对低16位数据的存取,不会影响高16位的数据。
数据寄存器
- 寄存器AX又称为累加器(Accumulator)用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;
- 寄存器BX又称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
- 寄存器CX又称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
- 寄存器DX又称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
说明:H(high)即高位,L(low)即低位
- AX可分为AH和AL
- BX可分为BH和BL
- CX可分为CH和CL
- DX可分为DH和DL
字节(byte):一个字节由8个bit组成,可以存在8位寄存器中;
字(word):一个字由2个字节组成,这两个字节分别被成为高位字和地位字;
一个字可以存在一个16位寄存器中。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,
在32位CPU中,EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
16位CPU结构和物理地址
16位CPU结构有如下特征:
- 运算器一次最多处理16位的数据;
- 寄存器的最大宽度是16位
- 寄存器和运算器之间的通路位16位
对于16位CPU:物理地址=段地址x16+偏移地址
123C8H : 1230*16+00C8 即 12300+00C8 = 123C8H(H表示16进制表示,B表示2进制)
可以用不同的段地址和偏移地址形成同一个物理地址
段寄存器
- CS——代码段寄存器(CodeSegmentRegister),其值为代码段的段值;
- DS——数据段寄存器(DataSegmentRegister),其值为数据段的段值;
- SS——堆栈段寄存器(StackSegmentRegister),其值为堆栈段的段值;
- ES——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值;
- FS——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值(32位CPU新增);
- GS——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值(32位CPU新增);
变址寄存器
SI 存储器指针、串指令中的源操作数指针
DI 存储器指针、串指令中的目的操作数指针
指针寄存器
寄存器EBP、ESP称为指针寄存器(PointerRegister),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指令指针寄存器
IP(InstructionPointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
标志寄存器
CS与IP
-
CS与IP的作用
CS:IP提供了CPU要执行指令的地址。从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
-
修改CS与IP的值
mov 指令不能用于设置CS、IP的值
"jum 寄存器"功能:用寄存器的值修改IP
读取一条指令后IP中的值会自动增加,让CPU可以读取下一一条指令。即IP=IP+所读取指令的长度,从而指向下一条指令
例:
jmp ax, //指令执行前: ax=1000H, CS=2000H,IP=0003H
//指令执行前: ax=1000H,CS=2000H,IP=1000H