处理器操作主要涉及处理数据。这些数据可以存储在内存中并从中访问。但是,读取数据并将其存储到内存中会减慢处理器的速度,因为它涉及将数据请求通过控制总线发送到内存存储单元并通过同一通道获取数据的复杂过程。

为了加快处理器操作速度,处理器包括了一些称为寄存器 (Registers) 的内部内存存储位置。

寄存器存储了用于处理的数据元素,而不必访问内存。处理器芯片中内置了数量有限的寄存器。

处理器寄存器

在 IA-32 体系结构中,有10个32位和6个16位处理器寄存器。寄存器分为三类——

  • 通用寄存器 (General registers),
  • 控制寄存器 (Control registers),以及
  • 段寄存器 (Segment registers)。

通用寄存器可进一步划分成——

  • 数据寄存器 (Data registers),
  • 指针寄存器 (Pointer registers),以及
  • 变址寄存器 (Index registers)。

数据寄存器

四个32位数据寄存器用于算术、逻辑和其他操作。这些32位寄存器可以用三种方式——

  • 完整的32位数据寄存器: EAX、EBX、ECX、EDX。
  • 32位寄存器的下半部分可以用作4个16位数据寄存器: AX、BX、CX 和 DX。
  • 上述4个16位寄存器的以上部分可用作8个8位数据寄存器: AH、AL、BH、BL、CH、CL、DH 和 DL。

其中一些数据寄存器在算术运算中有特定的用途。

AX 是主累加器 (primary accumulator),它用于输入/输出和大多数算术指令。例如,在乘法运算中,一个操作数根据操作数的大小存储在 EAX 或 AX 或 AL 寄存器中。

BX 是基寄存器 (base register),因为它可以用于索引寻址。

CX 是计数寄存器 (count register),因为在迭代操作中 ECX,CX 寄存器将存储循环次数。

DX 是数据寄存器 (data register),它也用于输入/输出操作。它还与 AX 寄存器一起使用,对大值进行乘和除的操作。

指针寄存器

指针寄存器为32位的 EIP、ESP 和 EBP 寄存器以及相应的16位右部分 IP、SP 和 BP。有三类指针寄存器——

  • 指令指针寄存器 ((Instruction Pointer) IP) ——16位 IP 寄存器存储要执行的下一个指令的偏移地址。与 CS 寄存器 (如 CS: IP) 关联的 IP 提供了代码段中当前指令的完整地址。
  • 堆栈指针寄存器 ((Stack Pointer) SP) ——16位 SP 寄存器在程序堆栈中提供偏移值。SP 与 SS 寄存器 (SS: SP) 的关系是指明了程序栈内的数据或地址的当前位置。
  • 基准指针寄存器 ((Base Pointer) BP) ——16位 BP 寄存器主要有助于引用传递给子程序 (subroutine) 的参数变量 (parameter variables)。将 SS 寄存器中的地址与 BP 的偏移量结合在一起,得到参数的位置。BP 还可以结合 DI 和 SI 作为特殊寻址的基础寄存器。

变址寄存器

32位索引寄存器、ESI 和 EDI 以及它们的16位最右边的部分 SI 和 DI,用于索引寻址,有时用于加法和减法。有两组索引指针——

  • 源变址寄存器(Source Index (SI)) ——它用作字符串操作的源索引。
  • 目的变址寄存器(Destination Index (DI)) ——它用作字符串操作的目标索引。

控制寄存器

控制寄存器包含32位指令指针寄存器和32位标志寄存器。

许多指令涉及比较和数学计算并更改标志的状态,一些其他条件指令测试这些状态标志的值以将控制流带到其他位置。

常见的标志位是:

  • 溢出标志 (Overflow Flag (OF)) ——它指示在有符号算术运算后,数据的高序位 (最左侧位) 的溢出。
  • 方向标志 (Direction Flag (DF)) ——它确定移动或比较字符串数据的左右方向。当 DF 值为0时,字符串操作采用从左到右的方向;当该值设置为1时,字符串操作从右向左方向。
  • 中断标志 (Interrupt Flag (IF)) ——它确定是否忽略或处理诸如键盘输入等外部中断。当值为0时,它将禁用外部中断,并在设置为1时启用中断。
  • 陷阱标志 (Trap Flag (TF)) ——它允许在单步模式下设置处理器的操作。我们使用的调试程序 (DEGUG) 设置了陷阱标志,因此我们可以一次单步执行一个指令。(百度百科将该寄存器称作跟踪标志 (Trace Flag),本人认为有误,参照维基百科词条 FLAGS register)
  • 符号标志 (Sign Flag (SF)) ——它显示算术运算结果的符号。此标志是根据算术运算后的数据项的符号设置的。符号由最左侧位的高阶表示。正值结果将 SF 的值清除为 0,负值结果将其设置为1。
  • 零标志 (Zero Flag (ZF)) ——它指示算术或比较运算的结果。非零结果将零标志清除为 0,零结果将其设置为1。
  • 辅助进位标志 (Auxiliary Carry Flag (AF)) ——在算数运算后,它存储从第3位到第4位的进位,用于专用算术。当1字节算术运算导致从第3位到第4位的进位时,将设置 AF。
  • 奇偶校验标志 (Parity Flag (PF)) ——它指示从算术运算获得的结果中1位的总数。偶数1位清除奇偶校验标志为 0,奇数1位将奇偶校验标志设置为1。
  • 进位标志 (Carry Flag (CF)) ——它存储从一个高阶位 (最左边) 在算术运算后的0或1的进位。它还存储 移位 (shift)旋转 (rotate) 操作的最后一个位的内容。

下表为16位标志寄存器中的标志位位置:

标志: O D I T S Z A P C
位号: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

段寄存器

段是在程序中定义的特定区域, 用于包含数据、代码和堆栈。有三主要部分——

  • 代码段 (Code Segment) ——它包含要执行的所有指令。16位代码段寄存器 (CS 寄存器) 存储代码段的起始地址。
  • 数据段 (Data Segment) ——它包含数据、常量和工作区域。16位数据段寄存器 (DS 寄存器) 存储数据段的起始地址。
  • 堆栈段 (Stack Segment) ——它包含程序或子程序的数据和返回地址。它是作为 "堆栈" 数据结构实现的。堆栈段寄存器 (SS 寄存器)存储堆栈的起始地址。

除了 DS、CS 和 SS 寄存器之外,还有其他额外的分段寄存器 ES (extra segment)、FS 和 GS,为存储数据提供了额外的段。

在汇编语言中,程序需要访问内存位置。段中的所有内存位置都相对于段的起始地址。段开始于一个可被16或十六进制10平均整除的地址。因此,所有这样的内存地址中最右边的十六进制数字是0,通常不存储在段寄存器中。

段寄存器存储段的起始地址。要获取段内数据或指令的确切位置,需要偏移值 (offset value) (或位移 (displacement))。要引用段中的任何内存位置,处理器将段寄存器中的段地址与位置的偏移值组合在一起。

汇编语言 Part 2——寄存器的更多相关文章

  1. [汇编语言]-第二章寄存器(CPU工作原理)

    1- 对于汇编程序员来说,CPU中主要的部件是寄存器,这些寄存器是:AX BX CX DX SI DI SP BP IP CS SS DS ES PSW. 2- 8086CPU所有寄存器都是16位的, ...

  2. HLA高级汇编语言基础

    HLA高级汇编语言环境的搭建与设置 我的操作系统:WINDOWS7 需要下载的东西:MASM32:http://www.masm32.com/masmdl.htm  HLA:http://webste ...

  3. 【CSAPP笔记】5. 汇编语言——数据

    本博客对于汇编的介绍基于32位机器的Intel x86系列处理器和IA32指令集,也涉及少部分x86-64.由于汇编知识相对复杂,这里只做简单介绍和记录,详细请参照书本! 数据格式 下面这张表格中体现 ...

  4. 【转载】硬盘MBR详细介绍

    原文地址:http://blog.chinaunix.net/uid-15007890-id-106892.html 硬盘MBR详细介绍      硬盘是现在计算机上最常用的存储器之一.我们都知道,计 ...

  5. [转]硬盘分区表知识——详解硬盘MBR

    http://www.blogjava.net/galaxyp/archive/2010/04/25/319344.html 硬盘是现在计算机上最常用的存储器之一.我们都知道,计算机之所以神奇,是因为 ...

  6. C嵌入汇编

    概述:linux内核源码中,有很多C语言中嵌入了汇编语句,如何理解这些汇编语句,对理解内核有很重要的作用. 具有输入和输出参数的嵌入式汇编语句的基本格式为: asm("汇编语句" ...

  7. Java学习之计算机基础(一)

    阅读本文大概需要 4 分钟 想要开始学习Java开发,需要掌握一些必要的计算机基础.如果你是计算机专业的人或者已经学过类似的课程,可以跳过这篇文章的阅读.计算机基础课程有很多,小编在大学里学过的课程就 ...

  8. linux-0.11 内核源码学习笔记一(嵌入式汇编语法及使用)

    linux内核源码虽然是用C写的,不过其中有很多用嵌入式汇编直接操作底层硬件的“宏函数”,要想顺利的理解内核理论和具体实现逻辑,学会看嵌入式汇编是必修课,下面内容是学习过程中的笔记:当做回顾时的参考. ...

  9. C语言与汇编衔接1

    研究实验二 问题研究过程: 发问:C语言中的变量究竟是什么,通过下面的程序进行C语言中的变量的学习 图1  URL.EXE函数 为了研究main函数的首地址,我首先自作聪明的用了一条_DX=main, ...

随机推荐

  1. ES6:string.raw浅析

    当前正学习ES6 ,遇到string.raw费心思,现将试验后的结果整理如下: 网上得来的试验: 语法 String.raw`templateStr`; String.raw(obj, ...subs ...

  2. SQL server 游标,随机数使用

    SELECT * FROM [goods] DECLARE test_cursor CURSOR scroll FOR SELECT goods_no, [unitprice] FROM [goods ...

  3. Android sdk manager 显示 “Done loading packages”,该怎么办?

    试了这个方法:请用管理员的身份运行"SDK Manager.exe".不管用. 下面的方法可以: 在SDK Manager下Tools->Options打开了SDK Mana ...

  4. PHP正则表达式 - 附录(常用正则表达式)

    常用正则表达式附录I 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1- ...

  5. Spring 顾问

    1.名称匹配方法切入点顾问 接口:ISomeService public interface ISomeService { public void doSome(); public void doSe ...

  6. SQL判断一个事件段 是否在数据库中与其他时间段有重叠 判断时间重叠

    数据库字段startDate 开始时间   endDate 结束时间  -两个参数 比如查2-2  至2-6 在数据库中是否与其他时间有重叠 四个条件有一项满足则有重叠时间 思路是这样子 以开始和结束 ...

  7. I/O流操做总结(三)

    说实话,其实我并不是很喜欢Java这门语言,尽管它很强大,有很多现成的API可以调用 但我总感觉它把简单的事情弄得太过复杂,甚至有时候会让人迷失 弄不清到底是为了写出东西,还是为了语言本身 我学习的第 ...

  8. Winform中Checkbox与其他集合列表类型之间进行关联

    本文提供了Checkbox与CheckedListBox.DataGridViewCheckBoxColumn等的联动关系 1.CheckboxAssociateFactroy.Create创建联动关 ...

  9. LeetCode House Robber 家庭劫犯(dp)

    题意:有一个整数序列,从中挑出一些数字,使得总和是最大,前提是,相邻的两个数字中只能挑其一.比如1 2 3 就只能挑2或者1和3. 思路:很直观的题,dp思想.降低规模,从小规模开始考虑.如果只有两个 ...

  10. Java抽象类、接口和内部类

    1.抽象方法.抽象类 1)抽象方法: 由abstract修饰 只有方法的定义,没有方法的具体实现(连{}都没有) 由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法体实现,用一个 ...