汇编语言之寄存器(详细介绍)

1、寄存器

32位寄存器有16个,分别是:

4个数据寄存器(EAX、EBX、ECX、EDX)。

2个变址和指针寄存器(ESI和EDI);2个指针寄存器(ESP和EBP)。

6个段寄存器(ES、CS、SS、DS、FS、GS)。

1个指令指针寄存器(EIP);1个标志寄存器(EFlags)。

2、数据寄存器

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

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通常称为累加器,用累加器进行的操作可能需要更少时间,累加器可用于乘、除、输入/输出等操作,

它们的使用频率很高。

BX称为基地址寄存器,它可作为存储器指针来使用。

CX称为计数寄存器,在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用cl来

指明位移的位数。

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

在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU

中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据、保存算术逻辑运算结果,而且也可

作为指针寄存器,所以,这些32位寄存器更具有通用性。

3、变址寄存器

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

存取,不影响高16位的数据。

ESI、EDI、SI和DI称为变址寄存器,它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器

操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

变址寄存器不可分割成8位寄存器,作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

它们可作一般的存储器指针使用,在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的

功能。

4、指针寄存器

32位CPU有2个32位通用寄存器EBP和ESP,其低16位对应先前CPU中的BP和SP,对低16位数

据的存取,不影响高16位的数据。

EBP、ESP、BP和SP称为指针寄存器,主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器

操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

指针寄存器不可分割成8位寄存器,作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

它们主要用于访问堆栈内的存储单元,并且规定:

BP为基指针寄存器,用它可直接存取堆栈中的数据。

SP为堆栈指针寄存器,用它只可访问栈顶。

5、段寄存器

段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成

的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。

32位CPU有6个段寄存器,分别如下:

CS:代码段寄存器    ES:附加段寄存器

DS:数据段寄存器    FS:附加段寄存器

SS:堆栈段寄存器    GS:附件段寄存器

在16位CPU系统中,只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问,在

32位微机系统中,它有6个段寄存器,所以在此环境下开发的程序最多可同时访问6个段。

32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的,有关规定

简单描述如下:

实方式:段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑

地址仍为“段地址:偏移地址”的形式,为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移地址。

保护方式:在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”的某个值。

6、指令指针寄存器

32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。

指令指针EIP、IP是存放下次将要执行的指令在代码段的偏移地址,在具有预取指令功能的系统中,下次要执

行的指令通常已被预取到指令队列中,除非发生转移情况,所以,在理解它们的功能时不考虑存在指令队列的情

况。

在实方式下,由于每个段的最大范围为64KB,所以,EIP的高16位肯定都为0,此时,相当于只用其低16

位的IP来反映程序中的指令的执行次序。

7、标志寄存器

1.运算结果标志位。一共6个,包括:CF进位标志位、PF奇偶标志位、AF辅助进位标志位、ZF零标志位、

SF符号标志位、OF溢出标志位。

2.状态控制标志位。一共3个,包括:TF追踪标志位、IF中断允许标志位、DF方向标志位。

以上标志位在第7章里都讲过了,在这里就不再解释了,现在讲讲32位标志寄存器增加的4个标志位。

1. I/O特权标志IOPL。

IOPL用两位二进制位来表示,也称为I/O特权级字段,该字段指定了要求执行I/O指令的特权级,如果当前

的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。

2. 嵌套任务标志NT。

NT用来控制中断返回指令IRET的执行。具体规定如下:

(1)     当NT=0,用堆栈中保存的值恢复EFlags、CS和EIP,执行常规的中断返回操作。

(2)     当NT=1,通过任务转换实现中断返回。

3. 重启动标志RF。

RF用来控制是否接受调试故障。规定:RF=0时,表示接受,否则拒绝。

4. 虚拟8086方式标志VM。

如果VM=1,表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。

8、32位地址的寻址方式

最后说一下32位地址的寻址方式。在前面我们学习了16位地址的寻址方式,一共有5种,在32位微机系统

中,又提供了一种更灵活、方便但也更复杂的内存寻址方式,从而使内存地址的寻址范围得到了进一步扩大。

在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为

偏移地址的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、

EDX、ESI、EDI、EBP、和ESP)都可以是偏移地址的一个组成部分。

当用32位地址偏移量进行寻址时,偏移地址可分为3部分:

1. 一个32位基址寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)。

2. 一个可乘以1、2、4、8的32位变址寄存器(EAX、EBX、ECX、EDX、ESI、EDI和EBP)。

3. 一个8位~32位的偏移常量。

比如,指令:mov ebx, [eax+edx*2+300]

Eax就是基址寄存器,edx就是变址寄存器,300H就是偏移常量。

上面那3部分可进行任意组合,省去其中之一或之二。

下面列举几个32位地址寻址指令:

Mov ax, [123456]

Mov eax, [ebx]

Mov ebx, [ecx*2]

Mov ebx, [eax+100]

Mov ebx, [eax*4+200]

Mov ebx, [eax+edx*2]

Mov ebx, [eax+edx*4+300]

Mov ax, [esp]

由于32位寻址方式能使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的规定,具体

规定如下:

1. 地址中寄存器的书写顺序决定该寄存器是基址寄存器还是变址寄存器。

如:[ebx+ebp]中的ebx是基址寄存器,ebp是变址寄存器,而[ebp+ebx]中的ebp是基址寄存器,ebx是变

址寄存器,可以看出,左边那个是基址寄存器,另一个是变址寄存器。

2. 默认段寄存器的选用取决于基址寄存器。

3. 基址寄存器是ebp或esp时,默认的段寄存器是SS,否则,默认的段寄存器是DS。

4. 在指令中,如果显式地给出段寄存器,那么显式段寄存器优先。

下面列举几个32位地址寻址指令及其内存操作数的段寄存器。

指令列举:          访问内存单元所用的段寄存器

mov ax, [123456]    ;默认段寄存器为DS。

mov ax, [ebx+ebp]    ;默认段寄存器为DS。

mov ebx, [ebp+ebx]    ;默认段寄存器为SS。

mov ebx, [eax+100]    ;默认段寄存器为DS。

mov edx, ES:[eax*4+200]    ;显式段寄存器为ES。

mov [esp+edx*2], ax    ;默认段寄存器为SS。

mov ebx, GS:[eax+edx*8+300]    ;显式段寄存器为GS。

mov ax, [esp]    ;默认段寄存器为SS。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 汇编语言之寄存器详解

    上图是cpu中三个组成部分:寄存器 运算器 控制器.其中寄存器是cpu中程序员用指令读取的唯一部件(调剂界面中的 寄存器窗口).如果是16位cpu,就是处理,传输,暂时存储的数据长度都是16位.所以16位的cpu,寄存器也是16位.<汇编语言>这本书中使用的是16位寄存器位例子来讲的,所以下面的内容也都是16位寄存器的. ps:查看处理器型号以及几核cpu,我现在的电脑4核64位 寄存器名字 16位的寄存器有:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

  • 16位汇编语言寄存器及指令整理(小结)

    寄存器 通用寄存器 8位寄存器 16位寄存器 32位寄存器 寄存器名称 AH,AL AX EAX 累加寄存器 BH,BL BX EBX 基地址寄存器 CH,CL CX ECX 计数器寄存器 DH,DL DX EDX 数据寄存器 SI ESI 源变址寄存器 DI EDI 源目标寄存器 DH,DL DX EDX 基地址寄存器 DH,DL DX EDX 栈顶寄存器 段寄存器 标号 名称 CS 代码段 DS 数据段 SS 栈段 ES 附加数据段 GS,FS 附加数据段(+80386) 专用寄存器 标号

  • 汇编语言之寄存器(详细介绍)

    1.寄存器 32位寄存器有16个,分别是: 4个数据寄存器(EAX.EBX.ECX.EDX). 2个变址和指针寄存器(ESI和EDI):2个指针寄存器(ESP和EBP). 6个段寄存器(ES.CS.SS.DS.FS.GS). 1个指令指针寄存器(EIP):1个标志寄存器(EFlags). 2.数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间. 32位CPU有4个32位通用寄存器:EAX.EBX.ECX和EDX.对低16位数据的取存,不会影

  • C语言 栈的表示和实现详细介绍

    C语言 栈的表示和实现详细介绍 定义:栈是限定仅在表尾进行插入和删除操作的线性表. 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来).栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针. 栈是允许在同一端进行插入和删除操作的特殊线性表.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom):栈底固定,而栈顶浮动:

  • nginx从编译安装到配置文件说明中文详细介绍

    本文详细介绍了Nginx从编译安装到配置文件说明,每一步都给出了详细介绍,可以作为安装Nginx的指导手册了 好了,费话不多说直接进入主题 1. 安装nginx 1.1 选择稳定版Nginx 我们编译安装nginx来定制自己的模块,机器CentOS 6.2 x86_64.首先安装缺少的依赖包: # yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 这些软件包如

  • Go 实现热重启的详细介绍

    最近在优化公司框架 trpc 时发现了一个热重启相关的问题,优化之余也总结沉淀下,对 go 如何实现热重启这方面的内容做一个简单的梳理. 1.什么是热重启? 热重启(Hot Restart),是一项保证服务可用性的手段.它允许服务重启期间,不中断已经建立的连接,老服务进程不再接受新连接请求,新连接请求将在新服务进程中受理.对于原服务进程中已经建立的连接,也可以将其设为读关闭,等待平滑处理完连接上的请求及连接空闲后再行退出.通过这种方式,可以保证已建立的连接不中断,连接上的事务(请求.处理.响应)

  • JavaScript执行机制详细介绍

    目录 1.进程与线程的概念 2.浏览器原理 3.同步与异步 4.执行栈与任务队列 5.事件循环(Event-Loop) 6.定时器 前言: 不论是工作还是面试,我们可能都经常会碰到需要知道代码的执行顺序的场景,所以打算花点时间彻底搞懂JavaScript的执行机制. 想要搞懂JavaScript执行机制,你需要清楚下面这些知识: (以浏览器环境为例,与Node环境不同) 1.进程与线程的概念 浏览器原理 事件循环(Event-Loop),任务队列(同步任务,异步任务,微任务,宏任务) 进程与线程

  • Linux内存管理和寻址详细介绍

    目录 1.概念 内存管理模式 地址类型划分 说明: 2.页式管理 x86架构32位cpu x86架构 64位cpu 3.地址划分 4. 调试 结语 1.概念 内存管理模式 段式:内存分为了多段,每段都是连续的内存,不同的段对应不用的用途.每个段的大小都不是统一的,会导致内存碎片和内存交换效率低的问题. 页式:内存划分为多个内存页进行管理,如在 Linux 系统中,每一页的大小为 4KB.由于分了页后,就不会产生细小的内存碎片.但是仍然也存在内存碎片问题. 段页式:段式和页式结合. 地址类型划分

  • AngularJS 执行流程详细介绍

    一.启动阶段 大家应该都知道,当浏览器加载一个HTML页面时,它会将HMTL页面先解析成DOM树,然后逐个加载DOM树中的每一个元素节点.我们可以把AngularJS当做一个类似jQuery的js库,我们通过<script>标签引入到HTML中,那么此时Angular就做为一个普通的DOM节点等待浏览器解析,当浏览器解析到这个节点时,发现它是一个js文件,那么浏览器会停止解析剩余的DOM节点,开始执行这个js(即angular.js),同时Angular会设置一个事件监听器来监听浏览器的DOM

  • Java探索之Hibernate主键生成策略详细介绍

    1.increment 由Hibernate从数据库中去除主键的最大值(每个session只取一次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库. <id name="id" column="id"> <generator class="increment" /> </id> Hibernate调用org.hibernate.id.IncrementGenerator类

  • python+mongodb数据抓取详细介绍

    分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: headers = { ..... } r = requests.get(url,headers,timeout=30) html = r.content soup = BeautifulSoup(html,"lxml") url = soup.find_all(正则表达式) for i

随机推荐