eax, ebx, ecx, edx, esi, edi, ebp, esp

来源:互联网 发布:网络教育资源 编辑:程序博客网 时间:2024/05/29 11:30

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字节。

esp:存放器存放当火线程的栈顶指针
ebp:存放器存放当火线程的栈底指针
eip:存放器存放下一个CPU指令存放的内存地址,当CPU履行完当前的指令后,从EIP存放器中读取下一条指令的内存地址,然后持续履行。

一般存放器: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位元

栈的根蒂根基模型

参数N

↓高地址

参数…

函数参数入栈的次序与具体的调用体式格式有关

参数 3

参数 2

参数 1

EIP

返回本次调用后,下一条指令的地址

EBP

保存调用者的EBP,然后EBP指向此时的栈顶。

姑且变量1

?

姑且变量2

?

姑且变量3

?

姑且变量…

?

姑且变量5

↓低地址谚语



首先介绍我们会经常看到的一些寄存器:
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
其他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是十六进制数

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是栈底指针寄存器。

http://www.cnblogs.com/lihaozy/archive/2011/08/01/2124315.html
0 0
原创粉丝点击