EAX、ECX、EDX、EBX寄存器的作用_eax ebx ecx edx_jena_wy的博客-程序员宅基地

一般寄存器:AX、BX、CX、DX
AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器

索引暂存器:SI、DI
SI:来源索引暂存器,DI:目的索引暂存器

堆叠、基底暂存器:SP、BP
SP:堆叠指标暂存器,BP:基底指标暂存器

EAX、ECX、EDX、EBX:為ax,bx,cx,dx的延伸,各為32位元
ESI、EDI、ESP、EBP:為si,di,sp,bp的延伸,32位元

eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。如果用C语言来解释,可以把这些寄存器当作变量看待。

比方说:add eax,-2 ; //可以认为是给变量eax加上-2这样的一个值。

这些32位寄存器有多种用途,但每一个都有“专长”,有各自的特别之处。

EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。

EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址。

ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。

EDX 则总是被用来放整数除法产生的余数。

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 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。



386部分寄存器:



状态和控制寄存器组除了EFLAGS、EIP ,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3。

这几个寄存器中保存全局性和任务无关的机器状态。

CR0中包含了6个预定义标志,0位是保护允许位PE(Protedted Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。1位是监控协处理位MP(Moniter coprocessor),它与第3位一起决定:当TS=1时操作码WAIT是否产生一个“协处理器不能使用”的出错信号。第3位是任务转换位(Task Switch),当一个任务转换完成之后,自动将它置1。随着TS=1,就不能使用协处理器。CR0的第2位是模拟协处理器位 EM (Emulate coprocessor),如果EM=1,则不能使用协处理器,如果EM=0,则允许使用协处理器。第4位是微处理器的扩展类型位ET(Processor Extension Type),其内保存着处理器扩展类型的信息,如果ET=0,则标识系统使用的是287协处理器,如果 ET=1,则表示系统使用的是387浮点协处理器。CR0的第31位是分页允许位(Paging Enable),它表示芯片上的分页部件是否允许工作。

CR1是未定义的控制寄存器,供将来的处理器使用。

CR2是页故障线性地址寄存器,保存最后一次出现页故障的全32位线性地址。

CR3是页目录基址寄存器,保存页目录表的物理地址,页目录表总是放在以4K字节为单位的存储器边界上,因此,它的地址的低12位总为0,不起作用,即使写上内容,也不会被理会。

这几个寄存器是与分页机制密切相关的,因此,在进程管理及虚拟内存管理中会涉及到这几个寄存器,读者要记住CR0、CR2及CR3这三个寄存器的内容。


esp:寄存器存放当前线程的栈顶指针
ebp:寄存器存放当前线程的栈底指针

eip:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。



参考二

eax ...edi esp ebp寄存器简介(转)

首先介绍我们会经常看到的一些寄存器:
4个数据寄存器(EAXEBXECXEDX)
2
个变址和指针寄存器(ESIEDI)
2个指针寄存器(ESPEBP)


4个数据寄存器(EAXEBXECXEDX)
32CPU432位的通用寄存器EAXEBXECXEDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AXBXCXDX,它和先前的CPU中的寄存器相一致。
416位寄存器又可分割成8个独立的8位寄存器(AXAH-ALBXBH-BLCXCH-CLDXDH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。

那么如何理解eax,ax,al(ah)之间的关系呢?
专业点可以这样解释:Eax32位寄存器,ax16位寄存器,al(ah)是八位寄存器。
那么eax存储的数据就是ax的两倍,axal(ah)的两倍。
Eax可以存储的数字是DWORD(双字)ax存储的是WORD(字)AL(AH)存储的是BYTE(字节),那么为什么又有AHAL呢,我们可以这样理解,AX=AH+ALAH存储的是AX的高8位数据,AL存储的是AX的低八位数据。H这里就是HIGH,L就是LOW.
假设eax是红色区域,那么eax现在就是64636261
那么ax就是eax的低十六位,也就是6261
Al61AH62
eax <wbr>...edi <wbr>esp <wbr>ebp寄存器简介(转)



其他ebxecxedx也有类似的bx,bl,bh等对应的寄存器,原理和上面相同。

在用途方面,他们有各自默认的用途:
Eax用来保存所有API函数的返回值。
寄存器AXAL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;
寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 
寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

由于存储的数据大小关系,AXBXCXDX不能作为基址和变址寄存器来存放存储单元的地址, 32位寄存器EAXEBXECXEDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。(什么是基址,什么是变址以后会说到)

2个变址和指针寄存器(ESIEDI)
32CPU232位通用寄存器ESIEDI。其低16位对应先前CPU中的SIDI,对低16位数据的存取,不影响高16位的数据。

寄存器ESIEDISIDI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。

2个重要的指针寄存器(ESPEBP)


这两个指针寄存器都和“栈”这个神秘的东东有关,那么什么是栈呢?这俩指针寄存器又有何作用呢?


从计算机科学的角度看,栈是一种数据结构,是一种先进后出的数据表。栈的最常见操作有两种:Push(入栈)和Pop(出栈)。


我们可以把栈想象成一摞扑克牌:
PUSH:为栈增加一个元素的操作是push,相当于在这摞扑克牌最上面再放一张

POP:从栈中取出一个元素的操作叫做POP,相当于从这摞扑克牌取出最上面的一

张。

TOP:标识栈顶位置,并且是动态变化的。每做一次PUSH 操作,它都会自增1

相反,每做一次POP 操作,它会自减1。栈顶元素相当于扑克牌最上面一张,只有


这张牌的花色是当前可以看到的。

BASE:标识栈底位置,它记录着扑克牌最下面一张的位置。BASE 用于防止栈空后

继续弹栈(牌发完时就不能再去揭牌了)。很明显,一般情况下,BASE 是不会变动


的。

用王爽《汇编语言》中的图说明一下push和pop操作
代码如下:
mov ax,0123H
push ax
mov bx,2266H
push bx
mov cx,1122H
pop ax
pop bx
pop cx

mov是传送数据的指令,mov ax,0123H表明把0123H这个值给ax
H代表0123是十六进制数

eax <wbr>...edi <wbr>esp <wbr>ebp寄存器简介(转)



mov是传送数据的指令,mov ax,0123H表明把0123H这个值给ax
H代表0123是十六进制数
图中左边的10000H等数值表明内存地址
箭头指向栈顶位置

 

那么针对此例栈底就是1000FH
栈顶由于入栈和出栈操作在不断变化。

那么在这里栈底1000FH就是BP 栈顶(不断变化的箭头)就是SP
(BP和SP分别是16位下的寄存器,与ebp,esp类似)

内存的栈区实际上指的就是系统栈。系统栈由系统自动维护,它用于实现高级语言中函

数的调用。对于类似C 语言这样的高级语言,我们无需担心他们是如何操作的。一般说来,只有在使用汇编语言的时候,才需要和它直接打交道。

那么ESP和EBP指的分别是什么呢?

(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。



本次重点内容:了解几个常见的寄存器名字,记住eax一般用来保存函数的返回值,记住esp是栈顶指针寄存器,ebp是栈底指针寄存器。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wyyy2088511/article/details/80966204

智能推荐

linux查看目录是不是btrfs,btrfs文件系统常用命令使用-程序员宅基地

Btrfs,也可称为B-tree,Butter FS,Better FS,是CentOS7中一种新型的文件系统。核心特性:1.多物理卷支持,可由多个物理卷(pv)组成,支持raid,以联机添加删除2.支持写实复制(Copy on Write,Cow)复制一份修改,改好之后用指针替换,出错时指回原本文件。而不是就地修改3.数据及元数据校验码:checksum4.子卷:Sub_volume5.快照,基...

Java xml编码格式转换_批量转换xml文件的编码格式(GB2312到UTF-8)_默默无闻的路人甲的博客-程序员宅基地

说实话不得不抱怨一下了,老师给了一堆xml文件让我解析,用python我弄了几个小时发现编码格式GB2312的转换为utf8的格式就是不行,我也不知道为什么。于是我放弃用python的方法转换编码格式,采用java的编码格式转换,发现终于可以了,真是想骂人了。import java.io.File;import java.io.FileOutputStream;import java.io.IOE..._java解析xml时,怎么把编码改为 utf-8无bom格式

2021-2022-1 20212820《Linux内核原理与分析》第一周作业_假设linux当前目录下有一文件info.txt,请使用脚本语言匹配显示_JIDAIN的博客-程序员宅基地

1.Linux用户及文件权限管理在 Linux 系统里, root 账户拥有整个系统至高无上的权限,比如新建和添加用户。ls命令可以显示当前目录下的文件。2._假设linux当前目录下有一文件info.txt,请使用脚本语言匹配显示

小程序view和text组件自动换行_小程序让text标签和view标签柔和在一起换行-程序员宅基地

突然碰到的问题:小程序中view和text组件并不能让文本自动换行web页面经常是遇到不让文本换行,所以不能换行立刻想到强制换行word-break和word-wrap。只要在wxss给view和text加上word-break:break-all就可以实现自动换行了..._小程序让text标签和view标签柔和在一起换行

html audio ios自动播放,解决ios下音频(audio)无法自动播放(autoplay)的问题_经略幽燕我童贯的博客-程序员宅基地

这个博客的虐狗页面一直是设置了自动播放背景音乐,之前测试的时候发现iphone和ipad pro都无法自动播放。当时也没太注意,今天再想起这个问题的时候强迫症犯了,觉得别人要是听不到歌会不会觉得逼格不够。于是还是寻求了一下解决办法。P.S. 虐狗页面已下架,关注代码即可。之前是直接在html里写了一句:123但是查阅资料发现ios以安全为名禁用了autoplay,所以你写了也没用。同时也禁止了JS..._ios audio autoplay

随便推点

cocos2dx-3.10-lua_函数-程序员宅基地

cocos2dx通过lua-bingding转化生成的lua文件都在如下目录Cocos/Cocos2d-x/cocos2d-x-3.10/cocos/scripting/lua-bindings/script/1.functions.luaio.exists(path) //是否存在可读文件,存在返回true,否则返回falseio.readfile(path

threejs 纹理流动_ThreeJS模拟人沿着路径运动-路径箭头使用纹理offset偏移-程序员宅基地

第一个three.js文件_WebGL三维场景body {margin: 0;overflow: hidden; //隐藏body窗口区域滚动条}/*** 创建场景对象*/var scene = new THREE.Scene();/*** 创建一个设置重复纹理的管道*/var curve = new THREE.CatmullRomCurve3([new THREE.Vector3(-80, -..._threejs模型跟着路径走

intellij IDEA设置自动删除没有用到的导入包-程序员宅基地

转载于:https://www.cnblogs.com/JerryTomcat/p/11595056.html

HTML的三种布局:DIV+CSS、FLEX、GRID-程序员宅基地

Div+css布局也就是盒子模型,有W3C盒子模型,IE盒子模型。盒子模型由四部分组成margin、border、padding、content。怎么区别这两种模型呢,区别在于w3c中的width是content的宽,IE的width是content+border+padding。具体的可以看下面的图:W3C盒子(标准盒子):IE盒子:Fle..._div+css和flex

Python的treelib构建多叉树——函数介绍_treelib show-程序员宅基地

举一些treelib库常用的函数,具体的参考 Useful APIsfrom treelib import Node, Treetree = Tree()tree.show()# # 取得根节点到每一个叶节点的标识路径,返回值为标识list列表的list列表(二重列表),根节点不省略tree.paths_to_leaves()# # 建议使用remove_node来删除节点..._treelib show

vue 展示本地图片三种方法_vue展示本地图片-程序员宅基地

第一种:直接写两个都可以 如果@配置了的话<img src="../assets/img/mapchange/map1.png" alt=""><img src="@/assets/img/mapchange/map1.png" alt="">第二种:import 然后在data内定义后 src绑定第三种:data内 require(’ 地址路径’) src直接绑定..._vue展示本地图片

推荐文章

热门文章

相关标签