寄存器
寄存器界说
寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的操控部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。
寄存器是内存阶级中的最顶端,也是体系取得操作材料的最快速途径。寄存器一般都是以他们能够保存的位元数量来估计,举例来说,一个 “8 位元寄存器”或 “32 位元寄存器”。寄存器现在都以寄存器档案的方法来实作,可是他们也或许运用独自的正反器、高速的中心内存、薄膜内存以及在数种机器上的其他方法来实作出来。
寄存器一般都用来意指由一个指令之输出或输入能够直接索引到的暂存器群组。更恰当的是称他们为 “架构寄存器”。
例如,x86 指令及界说八个 32 位元寄存器的调集,但一个实作 x86 指令集的 CPU 能够包含比八个更多的寄存器。
寄存器是CPU内部的元件,寄存器具有十分高的读写速度,所以在寄存器之间的数据传送十分快。
寄存器用处
1.可将寄存器内的数据履行算术及逻辑运算;
2.存于寄存器内的地址可用来指向内存的某个方位,即寻址;
3.能够用来读写数据到电脑的周边设备。
数据寄存器
8086 有14个16位寄存器,这14个寄存器按其用处可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。
(1)通用寄存器有8个, 又能够分红2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个).
数据寄存器分为:
AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来寄存操作数,别的,一切的I/O指令都运用这一寄存器与外界设备传送数据.
BH&BL=BX(base):基址寄存器,常用于地址索引;
CH&CL=CX(count):计数寄存器,常用于计数;常用于保存核算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.
DH&DL=DX(data):数据寄存器,常用于数据传递。
他们的特点是,这4个16位的寄存器能够分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器能够别离寻址,并独自运用。
另一组是指针寄存器和变址寄存器,包含:
SP(Stack Pointer):仓库指针,与SS合作运用,可指向现在的仓库方位;
BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址方位;
SI(Source Index):源变址寄存器可用来寄存相关于DS段之源变址指针;
DI(Destination Index):意图变址寄存器,可用来寄存相关于 ES 段之意图变址指针。
这4个16位寄存器只能按16位进行存取操作,首要用来构成操作数的地址,用于仓库操作和变址运算中核算操作数的有用地址。
(2) 指令指针IP(Instruction Pointer)
指令指针IP是一个16位专用寄存器,它指向当时需求取出的指令字节,当BIU从内存中取出一个指令字节后,IP就主动加1,指向下一个指令字节。留意,IP指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有用地址(EA,Effective Address)。
(3)标志寄存器FR(Flag Register)
8086有一个18位的标志寄存器FR,在FR中有意义的有9位,其间6位是状况位,3位是操控位。
OF:溢出标志位OF用于反映有符号数加减运算所得成果是否溢出。假如运算成果超越当时运算位数所能表明的规模,则称为溢出,OF的值被置为1,不然,OF的值被清为0。
DF:方向标志DF位用来决议在串操作指令履行时有关指针寄存器产生调整的方向。
IF:中止答应标志IF位用来决议CPU是否呼应CPU外部的可屏蔽中止宣布的中止请求。但不论该标志为何值,CPU都有必要呼应CPU外部的不行屏蔽中止所宣布的中止请求,以及CPU内部产生的中止请求。具体规则如下:
(1)、当IF=1时,CPU能够呼应CPU外部的可屏蔽中止宣布的中止请求;
(2)、当IF=0时,CPU不呼应CPU外部的可屏蔽中止宣布的中止请求。
TF:盯梢标志TF。该标志可用于程序调试。TF标志没有专门的指令来设置或清楚。
(1)假如TF=1,则CPU处于单步履行指令的作业方法,此刻每履行完一条指令,就显现CPU内各个寄存器的当时值及CPU行将履行的下一条指令。
(2)假如TF=0,则处于接连作业方法。
SF:符号标志SF用来反映运算成果的符号位,它与运算成果的最高位相同。在微机体系中,有符号数选用补码表明法,所以,SF也就反映运算成果的正负号。运算成果为正数时,SF的值为0,不然其值为1。
ZF:零标志ZF用来反映运算成果是否为0。假如运算成果为0,则其值为1,不然其值为0。在判别运算成果是否为0时,可运用此标志位。
AF:下列状况下,辅佐进位标志AF的值被置为1,不然其值为0:
(1)、在字操作时,产生低字节向高字节进位或借位时;
(2)、在字节操作时,产生低4位向高4位进位或借位时。
PF:奇偶标志PF用于反映运算成果中“1”的个数的奇偶性。假如“1”的个数为偶数,则PF的值为1,不然其值为0。
CF:进位标志CF首要用来反映运算是否产生进位或借位。假如运算成果的最高位产生了一个进位或借位,那么,其值为1,不然其值为0。)
4)段寄存器(Segment Register)
为了运用一切的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):仓库段寄存器;
ES(Extra Segment):附加段寄存器。
当一个程序要履行时,就要决议程序代码、数据和仓库各要用到内存的哪些方位,经过设定段寄存器 CS,DS,SS 来指向这些开端方位。一般是将DS固定,而依据需求修正CS。所以,程序能够在可寻址空间小于64K的状况下被写成恣意巨细。 所以,程序和其数据组合起来的巨细,约束在DS 所指的64K内,这便是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加快作业。
以上是8086寄存器的全体概略, 自80386开端,PC进入32bit年代,其寻址方法,寄存器巨细, 功用等都产生了改动:
=============================以下是80386的寄存器的一些材料======================================
寄存器都是32-bits宽。
A、通用寄存器
下面介绍通用寄存器及其习惯用法。望文生义,通用寄存器是那些你能够依据自己的志愿运用的寄存器,修正他们的值一般不会对核算机的运转形成很大的影响。通用寄存器最多的用处是核算。
EAX:通用寄存器。相对其他寄存器,在进行运算方面比较常用。在维护方法中,也能够作为内存偏移指针(此刻,DS作为段 寄存器或挑选器)
EBX:通用寄存器。一般作为内存偏移指针运用(相关于EAX、ECX、EDX),DS是默许的段寄存器或挑选器。在维护方法中,相同能够起这个效果。
ECX:通用寄存器。一般用于特定指令的计数。在维护方法中,也能够作为内存偏移指针(此刻,DS作为 寄存器或段挑选器)。
EDX:通用寄存器。在某些运算中作为EAX的溢出寄存器(例如乘、除)。在维护方法中,也能够作为内存偏移指针(此刻,DS作为段 寄存器或挑选器)。
同AX分为AH&AL相同,上述寄存器包含对应的16-bit分组和8-bit分组。
B、用作内存指针的特别寄存器
ESI:一般在内存操作指令中作为“源地址指针”运用。当然,ESI能够被装入恣意的数值,但一般没有人把它当作通用寄存器来用。DS是默许段寄存器或挑选器。
EDI:一般在内存操作指令中作为“意图地址指针”运用。当然,EDI也能够被装入恣意的数值,但一般没有人把它当作通用寄存器来用。DS是默许段寄存器或挑选器。
EBP:这也是一个作为指针的寄存器。一般,它被高档言语编译器用以制作‘仓库帧来保存函数或进程的局部变量,不过,仍是那句话,你能够在其间保存你期望的任何数据。SS是它的默许段寄存器或挑选器。
留意,这三个寄存器没有对应的8-bit分组。换言之,你能够经过SI、DI、BP作为别号拜访他们的低16位,却没有方法直接拜访他们的低8位。
C、段挑选器:
实方法下的段寄存器到维护方法下摇身一变就成了挑选器。不同的是,实方法下的“段寄存器”是16-bit的,而维护方法下的挑选器是32-bit的。
CS 代码段,或代码挑选器。同IP寄存器(稍后介绍)一起指向当时正在履行的那个地址。处理器履行时从这个寄存器指向的段(实方法)或内存(维护方法)中获取指令。除了跳转或其他分支指令之外,你无法修正这个寄存器的内容。
DS 数据段,或数据挑选器。这个寄存器的低16 bit连同ESI一起指向的指令行将处理的内存。一起,一切的内存操作指令 默许状况下都用它指定操作段(实方法)或内存(作为挑选器,在维护方法。这个寄存器能够被装入恣意数值,但是在这么做的时分需求当心一些。方法是,首先把数据送给AX,然后再把它从AX传送给DS(当然,也能够经过仓库来做).
ES 附加段,或附加挑选器。这个寄存器的低16 bit连同EDI一起指向的指令行将处理的内存。相同的,这个寄存器能够被装入恣意数值,方法和DS相似。
FS F段或F挑选器(估测F或许是Free?)。能够用这个寄存器作为默许段寄存器或挑选器的一个替代品。它能够被装入任何数值,方法和DS相似。
GS G段或G挑选器(G的意义和F相同,没有在Intel的文档中解说)。它和FS简直彻底相同。
SS 仓库段或仓库挑选器。这个寄存器的低16 bit连同ESP一起指向下一次仓库操作(push和pop)所要运用的仓库地址。这个寄存器也能够被装入恣意数值,你能够经过入栈和出栈操作来给他赋值,不过因为仓库关于许多操作有很重要的意义,因而,不正确的修正有或许形成对仓库的损坏。
* 留意 必定不要在初学汇编的阶段把这些寄存器弄混。他们十分重要,而一旦你把握了他们,你就能够对他们做恣意的操作了。段寄存器,或挑选器,在没有指定的状况下都是运用默许的那个。这句话在现在看来或许有点稀里糊涂,不过你很快就会在后面知道怎么去做。
指令指针寄存器:
EIP 这个寄存器十分的重要。这是一个32位宽的寄存器 ,同CS一起指向行将履行的那条指令的地址。不能够直接修正这个寄存器的值,修正它的仅有方法是跳转或分支指令。(CS是默许的段或挑选器)
上面是最基本的寄存器。下面是一些其他的寄存器,你乃至或许没有听说过它们。(都是32位宽):
CR0, CR2, CR3(操控寄存器)。举一个比如,CR0的效果是切换实方法和维护方法。
还有其他一些寄存器,D0, D1, D2, D3, D6和D7(调试寄存器)。他们能够作为调试器的硬件支撑来设置条件断点。
TR3, TR4, TR5, TR6 和 TR? 寄存器(测验寄存器)用于某些条件测验
最近在学汇编,看到这篇文章,文章的原出处现已查不出来了,但觉得不错,所以转出来,当作备份学习。
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),每个寄存器都有自己的称号,可独立存取。程序员可运用数据寄存器的这种”可分可合”的特性,灵敏地处理字/字节的信息。
寄存器AX和AL一般称为累加器(Accumulator),用累加器进行的操作或许需求更少时刻。累加器可用于乘、 除、输入/输出等操作,它们的运用频率很高; 寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来运用; 寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来操控循环次数;在位操作 中,当移多位时,要用CL来指明移位的位数;
寄存器DX称为数据寄存器(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、指针寄存器
32位CPU有2个32位通用寄存器EBP和ESP。其低16位对应从前CPU中的SBP和SP,对低16位数据的存取,不影响高16位的数据。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),首要用于寄存仓库内存储单元的偏移量,用它们可完成多种存储器操作数的寻址方法,为以不同的地址方法拜访存储单元供给方便。指针寄存器不行分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算成果。
它们首要用于拜访仓库内的存储单元,而且规则:
BP为基指针(Base Pointer)寄存器,用它可直接存取仓库中的数据;
SP为仓库指针(Stack Pointer)寄存器,用它只可拜访栈顶。
4、段寄存器
段寄存器是依据内存分段的管理方法而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可拜访较大物理空间的内存地址。
CPU内部的段寄存器:
CS——代码段寄存器(Code Segment Register),其值为代码段的段值;
DS——数据段寄存器(Data Segment Register),其值为数据段的段值;
ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
SS——仓库段寄存器(Stack Segment Register),其值为仓库段的段值;
FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
GS——附加段寄存器(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)是寄存下次行将履行的指令在代码段的偏移量。在具有预取指令功用的体系中,下非必须履行的指令一般已被预取到指令行列中,除非产生搬运状况。所以,在了解它们的功用时,不考虑存在指令行列的状况。
在实方法下,因为每个段的最大规模为64K,所以,EIP中的高16位必定都为0,此刻,相当于只用其低16位的IP来反映程序中指令的履行次第。
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方法下的作业状况,不然,处理机处于一般维护方法下的作业状况