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

为了加快处理器操作速度,处理器包括了一些称为寄存器 (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. Netty(7)-传对象

    改造timer,即客户端与服务端建立连接后,服务端主动向客户端发送当前时间. server: ch.pipeline().addLast(new TimeEncoder()); ch.pipeline ...

  2. 应用的入口——Startup

    应用的入口——Startup 一个ASP.NET Core应用被启动之后就具有了针对请求的处理能力,而这个能力是由管道赋予的,所以应用的启动同时意味着管道的成功构建.由于管道是由注册的服务器和若干中间 ...

  3. 【0 基础学Dojo】第【1】篇 HelloWord

    打开dojo 官网首页 http://dojotoolkit.org/,我们看到 点击get dojo  你将得到下载Dojo 的不同方式 2,点击下面方式下载, 解压后 新建myTest.html, ...

  4. 利用Vagrant and VirtualBox搭建core os环境

    利用Vagrant and VirtualBox搭建core os环境 系统环境 ubuntu 14.04 x64 vagrant 1.7.4 virtualbox 4.3.10 git 1.9.1 ...

  5. NIO基础之Buffer

    java.io 核心概念是流,即面向流的编程,在java中一个流只能是输入流或者输出流,不能同时具有两个概念. java.nio核心是 selector.Channel.Buffer ,是面向缓冲区( ...

  6. ZR#330. 【18 提高 3】矿石(容斥)

    题意 题目链接 Sol 挺显然的,首先对每个矿排序 那么答案就是$2^x - 2^y$ $x$表示能覆盖到它的区间,$y$表示的是能覆盖到它且覆盖到上一个的区间 第一个可以差分维护 第二个直接vect ...

  7. 20170405JDBC数据查询

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  8. Bootstrap设置按钮禁用

    在Bootstrap中,按钮可以使用button标签或者a标签.设置按钮禁用可以通过两种方式,一种是通用CSS样式,一种是用过JS脚本动态设置,下面举例说明! <!DOCTYPE html> ...

  9. Java中的多线程详解

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  10. Python一个有意思的地方:reduce、map、filter

    今天阅读了关于Python函数式编程的系列文章,地址在这里: http://www.cnblogs.com/huxi/archive/2011/06/24/2089358.html 里面提到了四个内建 ...