`
隐形的翅膀
  • 浏览: 498471 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

32位寄存器

 
阅读更多
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),每个寄
存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字
节的信息。

寄存器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中的BP和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来反映程序中指令的执行次序。

x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.

在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:

[1] 通用寄存器: EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途) 这些32位可以被用作多种用途,但每一个都有"专长".
        EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器.
        EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址.
         ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器.
       EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数.
     这4个寄存器的低16位可以被单独访问,分别用AX,BX,CX和DX. AX又可以单独访问低8位(AL)和高8位(AH), BX,CX,DX也类似. 函数的返回值经常被放在EAX中.
        ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.
       EBP是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码: push ebp ;保存当前ebp mov ebp,esp ;EBP设为当前堆栈指针 sub esp, xxx ;预留xxx字节给函数临时变量. ... 这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可.
      ESP 专门用作堆栈指针. 

   [2] 段寄存器:
           CS(Code Segment,代码段) 指定当前执行的代码段. EIP (Instruction pointer, 指令指针)则指向该段中一个具体的指令. CS:EIP指向哪个指令, CPU 就执行它. 一般只能用jmp, ret, jnz, call 等指令来改变程序流程,而不能直接对它们赋值.
          DS(DATA SEGMENT, 数据段) 指定一个数据段.
          注意: 在当前的计算机系统中, 代码和数据没有本质差别, 都是一串二进制数, 区别只在于你如何用它. 例如, CS 制定的段总是被用作代码, 一般不能通过CS指定的地址去修改该段. 然而,你可以为同一个段申请一个数据段描述符"别名"而通过DS来访问/修改. 自修改代码的程序常如此做.
           ES,FS,GS 是辅助的段寄存器, 指定附加的数据段.
           SS(STACK SEGMENT)指定当前堆栈段
          ESP 则指出该段中当前的堆栈顶. 所有push/pop 系列指令都只对SS:ESP指出的地址进行操作.

[3] 标志寄存器(EFLAGS): 该寄存器有32位,组合了各个系统标志. EFLAGS一般不作为整体访问, 而只对单一的标志位感兴趣. 常用的标志有:
          进位标志C(CARRY), 在加法产生进位或减法有借位时置1, 否则为0.
         零标志Z(ZERO), 若运算结果为0则置1, 否则为0
         符号位S(SIGN), 若运算结果的最高位置1, 则该位也置1.
          溢出标志O(OVERFLOW), 若(带符号)运算结果超出可表示范围, 则置1.
           JXX 系列指令就是根据这些标志来决定是否要跳转, 从而实现条件分枝. 要注意,很多JXX 指令是等价的, 对应相同的机器码. 例如, JE 和JZ 是一样的,都是当Z=1是跳转. 只有JMP 是无条件跳转. JXX 指令分为两组, 分别用于无符号操作和带符号操作.
         JXX 后面的"XX" 有如下字母: 无符号操作: 带符号操作: A = "ABOVE", 表示"高于" G = "GREATER", 表示"大于" B = "BELOW", 表示"低于" L = "LESS", 表示"小于" C = "CARRY", 表示"进位"或"借位" O = "OVERFLOW", 表示"溢出" S = "SIGN", 表示"负" 通用符号: E = "EQUAL" 表示"等于", 等价于Z (ZERO) N = "NOT" 表示"非", 即标志没有置位. 如JNZ "如果Z没有置位则跳转" Z = "ZERO", 与E同. 如果仔细想一想,就会发现 JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, ....
分享到:
评论

相关推荐

    mips32位的32个寄存器组成的寄存器组

    在MIPS32架构中,寄存器组由32个32位的通用寄存器构成,每个寄存器可以存储一个32位的数据,如整数、地址或浮点数。 首先,我们要理解寄存器在CPU中的作用。寄存器是计算机中最快的数据存储单元,它们位于处理器...

    VC6写的32位寄存器计算器,源码

    这款计算器的实现基于微软的Visual C++ 6.0(简称VC6)编程环境,通过源代码,我们可以深入理解如何在C++中处理二进制数据,并对32位寄存器进行操作。 首先,让我们来看看源码结构。项目文件包括`.aps`、`.clw`、`....

    汇编---32位寄存器

    汇编---32位寄存器 汇编语言中的寄存器是指CPU内部的寄存器,用于存储和处理数据。32位CPU中有多种类型的寄存器,每种寄存器都有其特定的功能和用途。 1. 数据寄存器 数据寄存器主要用来保存操作数和运算结果等...

    Verilog HDL 写的32位锁存寄存器

    #### 三、32位锁存移位寄存器设计分析 ##### 3.1 设计目标 根据题目描述,该设计的目标是实现一个32位带锁存功能的移位寄存器。主要功能包括: - 在时钟信号上升沿到来时,根据控制信号决定是否更新寄存器内部状态...

    所有32位寄存器英文全称

    所有32位寄存器英文全称

    Stm32之寄存器列表.pdf

    其包含了两个32位的寄存器,ISER0和ISER1,每个寄存器对应32个中断。通过将相应的位写入1,可以启用对应的中断。例如,NVIC_ISER0[0]对应第一个中断,NVIC_ISER0[1]对应第二个中断,以此类推。 中断清除寄存器...

    32位汇编寄存器

    寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件...

    gpr.zip_32位堆寄存器_gpr 寄存器_gpr寄存器_savegpr_27_寄存器堆

    "gpr.zip_32位堆寄存器_gpr寄存器_gpr寄存器_savegpr_27_寄存器堆"这个标题涉及到的核心概念是通用寄存器(General Purpose Registers,简称GPRs)和32位寄存器堆。 首先,我们来详细了解一下32位堆寄存器。在...

    STM32中断寄存器配置说明

    由15个32位寄存器组成,每个中断占用8位,但只使用高4位。 3. 中断优先级配置:STM32允许通过IPR寄存器设置每个中断的优先级,这涉及到中断的分组。共有5个中断分组,由SCB->AIRCR寄存器的位10到位8决定。每个分组...

    stm32寄存器程序源码

    STM32寄存器程序源码是针对STMicroelectronics公司的微控制器STM32F103EZ设计的软件代码,该控制器属于STM32 F1系列,基于ARM Cortex-M3内核。STM32F103EZ拥有丰富的外设接口和较高的处理能力,广泛应用于嵌入式系统...

    STM32用寄存器配置片内资源实例。

    2. **参考手册**:配置寄存器前,需要查阅STM32的数据手册和参考手册,了解每个寄存器的位定义、功能和操作方法。手册中通常会详细列出每个寄存器的地址、位宽和位意义。 3. **地址映射**:STM32的寄存器分布在不同...

    Quartus寄存器

    Quartus寄存器是Altera公司的Quartus II软件中的一个重要组成部分,它在数字电路设计,特别是基于Field-Programmable Gate Array (FPGA)的设计中起到关键作用。Quartus II是一款强大的硬件描述语言(HDL)综合、仿真、...

    STM32_NVIC寄存器详解.doc

    ISER寄存器是一个32位寄存器,用于使能或禁用中断请求。写入1到该寄存器可以使能中断,写入0可以禁用中断。 ICER寄存器(中断除能寄存器): ICER寄存器是一个32位寄存器,用于除能中断请求。写入1到该寄存器可以除...

    基于STM32备份寄存器BKP实验

    备份寄存器是STM32的一个重要特性,它们位于备份域,由一组独立的16位寄存器组成。这些寄存器在VDD电源掉电后仍能保持数据,通常用于存储在系统断电或待机模式下需要保留的重要信息,如配置参数、计数器等。 二、...

    计算机组成原理实验 MIPS 寄存器堆 logisim

    计算机组成原理实验 MIPS 寄存器堆 logisim

    128bit寄存器

    每个时钟周期,寄存器通过32位总线传输32位数据,所以四个周期总共传输128位(32位 * 4 = 128位)。这种操作方式称为“分时复用”或者“时分多路复用”,它允许较窄的接口处理更宽的数据。 这种设计有以下几点重要...

    寄存器查看小工具,实现32位内寄存器计算

    在32位架构中,如ARM Cortex系列处理器(如STM32微控制器),寄存器通常有32个比特宽,可以存储从0到4294967295的整数值,这涵盖了二进制、十进制和十六进制的各种表示。这个工具能帮助开发者直观地查看和操作这些...

    32位Arm寄存器组

    32位Arm寄存器组代码 使用了RAM模板作为初始代码 已成功通过了编译和仿真 (环境Quartus12.0)

Global site tag (gtag.js) - Google Analytics