900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 汇编学习笔记1 通用寄存器和段寄存器详解

汇编学习笔记1 通用寄存器和段寄存器详解

时间:2024-07-08 08:39:25

相关推荐

汇编学习笔记1 通用寄存器和段寄存器详解

一、通用寄存器

数据寄存器 EAX, EBX, ECX, EDX (Data Register)

数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。

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通常称为累加器(Accumulator Register),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;

寄存器BX称为基址寄存器(Base Register)。它可作为存储器指针来使用;

寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;

寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

指针寄存器 EBP, ESP (Pointer Register)

32位CPU有2个32位通用寄存器EBP和ESP。其低16位对应先前CPU中的SBP和SP,对低16位数据的存取,不影响高16位的数据。

指针寄存器主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

寄存器BP称为基址指针寄存器(Base Pointer);

寄存器SP称为堆栈指针寄存器(Stack Pointer)。

变址寄存器 ESI, EDI (Index Register)

32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。

变址寄存器主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

寄存器SI称为源变址寄存器(Source Index);

寄存器DI称为目的变址寄存器(Destination Index)。

二、段寄存器

段寄存器是因为对内存的分段管理而设置的。(存储单元的内容采用“高高低低”的原则来存放数据)

16位CPU 段寄存器

16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段。段寄存器及其偏移量的引用关系如图所示。

段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。

段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。

段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。

通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。当然,在一般指令中,我们还可以用强置前缀的方法来改变操作数的段寄存器。

32位CPU 段寄存器

32位CPU内有6个段寄存器,程序在某一时刻可访问6个不同的段。其段寄存器的值在不同的方式下具有不同的含义:

(1)、在实方式下,段寄存器的值就是段地址;

(2)、在保护方式下,段寄存器的值不是段地址,是段地址的“选择器”。它间接指出一个32位的段地址。

代码段寄存器:32位微机在取指令时,系统自动引用CS和EIP来取出下条指令。

在实方式下,由于段的最大容量不超过64K,所以,EIP的高16位全为0,其效果相当于16位CPU中的IP。

堆栈段寄存器:32位微机在访问堆栈段时,总是引用堆栈段寄存器SS。但在不同的方式下其堆栈指针有所不同:

(1)、在实方式下,32位微机把ESP的低16位SP作为指向堆栈的指针,所以,我们可以认为栈顶单元是由SS和SP来指定的。这就与16位微机访问栈顶单元的方法相一致;

(2)、在保护方式下,堆栈指针可用32位的ESP和16位的SP。

数据段寄存器:DS是主要的数据段寄存器。通常情况下,它是除访问堆栈以外数据时的默认段寄存器。在某些串操作中,其目的操作数的段寄存器被指定为ES是另一个例外。

另外,段寄存器CS、SS、ES、FS和GS也都可以作为访问数据时的段寄存器,但它们必须用段超越前缀的方式在指令中直接写出。用这种方式会增加指令的长度,指令的执行时间也有所延长。

一般来说,程序频繁访问的数据段用DS来指向,不太经常访问的数据段可用ES、FS和GS等来指向。

段寄存器及其指针寄存器的引用关系

由上表可以看出16位CPU在段寄存器的引用方面有如下规定:

1、取指令所用的段寄存器和偏移量一定是用CS和IP;

2、堆栈操作所用的段寄存器和偏移量一定是SS和SP;

3、串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI;

4、其它情况,段寄存器除了其默认引用的寄存器外,还可以强行改变为其它段寄存器。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。