计算机寄存器分类简介1:
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)**
1.数据寄存器
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,
它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器
(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),
每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
-------------------------------------------------------------
寄存器EAX通常称为累加器(Accumulator),
用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高;
寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;
在位操作中,当移多位时,要用CL来指明移位的位数;
寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,
也可用于存放I/O的端口地址。
-------------------------------------------------------------
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,
在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,
而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2.变址寄存器
32位CPU有2个32位通用寄存器ESI和EDI。
其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),
它们主要用于存放存储单元在段内的偏移量,
用它们可实现多种存储器操作数的寻址方式,
为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们可作一般的存储器指针使用。
在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3.指针寄存器
其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。
32位CPU有2个32位通用寄存器EBP和ESP。
它们主要用于访问堆栈内的存储单元,并且规定:
EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),
主要用于存放堆栈内存储单元的偏移量,
用它们可实现多种存储器操作数的寻址方式,
为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。作为通用寄存器,
也可存储算术逻辑运算的操作数和运算结果。
4.段寄存器
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;
EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;
EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
------------------------------------------------------------
16位CPU系统中,它只有4个段寄存器,
所以,程序在任何时刻至多有4个正在使用的段可直接访问;
在32位微机系统中,它有6个段寄存器,
所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。
在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下:
实方式:
前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,
内存单元的逻辑地址仍为“段值:偏移量”的形式。
为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护方式:
在此方式下,情况要复杂得多,装入段寄存器的不再是段值,
而是称为“选择子”(Selector)的某个值。
5.指令指针寄存器
32位CPU把指令指针扩展到32位,
并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)
是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,
下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
6.标志寄存器
一、运算结果标志位
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。
如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:
多字(字节)数的加减运算,无符号数的大小比较运算,
移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。
如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。
在数据传送过程中,为了提供传送的可靠性,
如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,
标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。
如果运算结果为0,则其值为1,否则其值为0。
在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。
运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。
如果运算结果超过当前运算位数所能表示的范围,则称为溢出,
OF的值被置为1,否则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。
如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
二、状态控制标志位
状态控制标志位是用来控制CPU操作的,
它们要通过专门的指令才能使之发生改变。
1、追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,
即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,
但程序员可用其它办法来改变其值。
2、中断允许标志IF(Interrupt-enable Flag)
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
CPU的指令系统中也有专门的指令来改变标志位IF的值。
3、方向标志DF(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
具体规定在第5.2.11节——字符串操作指令——中给出。
在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
三、32位标志寄存器增加的标志位
1、I/O特权标志IOPL(I/O Privilege Level)
I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。
该字段指定了要求执行I/O指令的特权级。
如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,
否则将发生一个保护异常。
2、嵌套任务标志NT(Nested Task)
嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:
(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,
执行常规的中断返回操作;
(2)、当NT=1,通过任务转换实现中断返回。
3、重启动标志RF(Restart Flag)
重启动标志RF用来控制是否接受调试故障。
规定:RF=0时,表示“接受”调试故障,否则拒绝之。
在成功执行完一条指令后,处理机把RF置为0,
当接受到一个非调试故障时,处理机就把它置为1。
4、虚拟8086方式标志VM(Virtual 8086 Mode)
如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,
否则,处理机处于一般保护方式下的工作状态。
计算机寄存器分类简介2:
- 一般寄存器 :AX 、 BX 、 CX 、 DX
AX: 累加寄存器,
BX: 基址寄存器,
CX: 計數寄存器,
DX: 数据 寄存器
ax,bx,cx,dx 各為 16 位即 2bytes 空間的寄存器,
其中 ax 又可化分为 ah 和 al ,
而 bx 可化分為 bh 與 bl ,
cx 及 dx 亦同,
而 ah 和 al 空間即為 8 位 1byte 的空間,
例:
如果 ax=3478h ,那麼 ah=34h 、 al=78h
其中 bx 又可用來 間接寻址 的寄存器使用,
例:
假如 ds=2300h , bx=0200h ,
那麼執行 mov ax,[bx] 指令後,
就會把 2300:0200 存储器的数据取出 2byes 並存入 ax
EAX (32位寄存器)
-------------------------------------------------------------
| AX (16位寄存器)
-------------------------------
| AH | AL
EBX,ECX,EDX同理
- 索引寄存器 :SI 、 DI
SI: 來源索引寄存器,
DI: 目的索引寄存器
16 位寄存器,功能同 bx 可間接寻址,但不能化分成两个 8 位
- 堆栈、基址寄存器 :SP 、 BP
SP: 堆栈指標寄存器,
BP: 基底指標寄存器
SP 是堆栈指標,當使用 push 指令時,
sp 會加 2 ,而執行 pop 時 sp 會減 2
BP 是可間接寻址的寄存器,不過通常用於堆栈段,
如 mov ax,ss:[bp]
- 指位 / 指標寄存器 ( 指位器 ):IP
程序在執行時,它用來記錄現在程序執行到哪裡,
當遇到 jmp 、 call 、 int 等等的跳转指令時,
它的內容也會隨著欲跳转前往的地址而改變
- 段寄存器 :CS 、 DS 、 ES 、 SS 、 FS 、 GS
代码段 CS :如 IP 所執行地址都是 CS 代码段的內容
数据段 DS :如 mov ax,[bx] 間接寻址法所指都是数据段的数据
附加段 ES :如 mov ax,es:[di] 利用間接寻址法取其他區段存储器数据時
堆栈段 SS :如 SP 堆栈数据,都是指在堆栈段的
附加段 FS :新增區段寄存器
附加段 GS :新增區段寄存器
- 标志寄存器 :FLAG
PF(parity flag):奇偶标志位。
这个位的判断需要我们将结果转为二进制来看,
如果结果的低8位中有偶数个1,就将PF的值置1;如果是奇数个1,就置0。
要注意的是一定是结果的低8位。
AF(auxiliary flag):辅助进位标志位。
这个位用的不多。
这个位表示加减法做到一半时有没有形成进位/借位,如果有则AF=1。
这么说谁都听不懂,所以我们举个例子来说下。
例如 MOV AL,00001110 MOV BL,00001000 ADD AL,BL
最后结果为AL=00010110这就是低四位向高四位进位。
反之在减法中第三位不够减向第四位借位
(注意数位是从第0位开始数的)叫低四位向高四位借位
像前面的AL中前四位为高四位,后四位为低四位。
例如,当两个字节相加时,如果从低4位向高4位有进位时,则AF=1。
ZF(zero flag):零标志位。
判断结果是不是0。如果结果为0,就置1;不为0,就置0。
SF(sign flag):符号标志位。
既然是符号标志位,就是对有符号数据来说的。
如果结果为负,就置1;结果为正,就置0。
TF(timer overblow flag):定时器溢出标志。
这个位主要是用来在debug中进行-t指令时使用的。
当cpu在执行完一条指令后,
如果检测到TF位的值为1,则产生单步中断,引发中断过程。
通过这个位,我们就可以在debug中对程序进行单步跟踪。
IF(interrupt flag):中断允许标志位。
当IF=1时,cpu在执行完当前指令后响应中断,引发中断过程;
当IF=0时,则不响应可屏蔽中断。
DF(direction flag):方向标志位。
在串处理指令中,控制每次操作后,
si(指向原始偏移地址)、di(指向目标偏移地址)的增减。
当DF=0时,每次操作后,si、di递增;
DF=1时,每次操作后,si、di递减。
我们可以使用cld指令将DF的值置为0,使用std指令将DF的值置为1。
DF需要与rep、movsb等指令配合使用。
OF(overflow flag):溢出标志位。
这个位是用来判断有没有溢出的。
注意溢出这个概念只对于有符号数据而言,
就如同进位只对于无符号数据而言。
当OF=0时,说明没有溢出;当OF=1时,说明溢出了。
- 386 以上電腦新增擴充之寄存器
EAX 、 ECX 、 EDX 、 EBX :为 ax,bx,cx,dx 的扩展,各為 32 位
ESI 、 EDI 、 ESP 、 EBP :为 si,di,sp,bp 的扩展, 32 位
EFLAG 、 EIP :为 FLAG 與 IP 之扩展, 32 位
FS 、 GS :新增的段寄存器
指令:传送,交换,取地址
1.mov
如:
mov eax,20 ;把立即数20送入通用寄存器
mov edi,esi ;寄存器之间传递数据
mov dVar,20 ;把20送入内存操作数(变量)
mov WORD PTR [EBX],20 ;传送字到EBX指向的地址
mov [ebx],DWORD PTR [ESI] ;错误指令,两个操作数不能都是内存操作数,
可改为两条指令完成这个需求
mov ds,0023h ;错误指令,立即数不能直接送段寄存器
mov ds,ss ;错误指令,两个段寄存器之间不能直接传送
mov cs,ax ;错误指令,CS段寄存器不能作为目标操作数
2.movzx
move with zero extend高位不足用0填充
源操作数的位数必须比目标操作数要少
源操作数不能是立即数
如:
mov eax,al
3.movsx
move with sign extend高位不足用符号位填充
源操作数的位数必须比目标操作数要少
源操作数不能是立即数
如:
mov al,82h
movsx bx,al ;此时bx为:0FF82H,BX的高八位设置为1
4.xchg
将原操作数与目的操作数的内容进行交换
两个操作数必须有一个是通用寄存器
如:
xchg eax,ebx
5.bswap
如:
bswap eax
该指令的意思是将eax的高字节和低字节的内容互换
中间两个字节的内容互换
操作数必须是一个32位寄存器
6.lea
把源操作数的有效地址传递给目标操作数
如:
lea eax,dvar
此指令与如下指令效果相同
lea eax,offset dvar
在内存中的代码分别为:
lea eax,[0040400a]
mov eax,0040400a
另:
lea指令能完成运算功能
mov eax,20
lea ebx,[eax+1] ;此时ebx为21
如在此处做乘法运算,乘数必须为1,2,4,8
7.lds,les,lfs,lgs
从内存操作数(源操作数)中取6个字节,
前面4个字节的内容作为一个双字送给目标操作数
后面两个字节送给DS或ES,FS,GS
假设FWORD类型的变量fVar的指向如下内存
00404040--->7d
00404041--->40
00404042--->40
00404043--->00
00404044--->23
00404045--->00
那么lds esi,fvar指令执行之后
esi中的内容为0040407dH
DS中的内容为0023H