见上文第:段
一般寄存器: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 ),是重复前缀指令和循环指令的内定计数器。
EDX总是用于加入整数除法的馀数。
ESI/EDI分别称为源寄存器/目标寄存器(source/destination index )。 因为在许多字符串操作指令中,DS:ESI指向源字符串,而ES:EDI指向目标字符串。
EBP是“基地址指针”(BASE POINTER ),最常用于高级语言函数调用的“帧指针”(frame pointer )。 在解密时,标准的函数开始代码:很常见
推送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寄存器读出下一个指令的存储器地址继续执行。
参考2 :
eax …edi esp ebp寄存器介绍
首先,我将介绍我们经常看到的寄存器:
4个数据寄存器(EAX、EBX、ECX、EDX ) )。
两个索引和指针寄存器(ESI和EDI ) )。
两个指针寄存器(ESP和EBP ) )。
4个数据寄存器(EAX、EBX、ECX、EDX ) :
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 ) ) ) ),每个寄存器中程序员利用这种数据寄存器的“可分离”特性,可以灵活地处理字/字节信息。
那么,如何理解eax、ax、al、ah的关系呢?
专业方面可以解释为,Eax是32位寄存器,ax是16位寄存器,al(ah )是8位寄存器。
eax存储的数据是ax的两倍,ax是al(ah )的两倍。
可以存储在Eax中的数字是DWORD (双字) ax包含word (AL ) AH (字节),为什么存储AH和al呢? 可以理解为AX=AH AL,AH存储ax的前8位数据,AL存储ax的后8位数据。 这里是高电平,l是低电平。
假设eax是红色区域,则eax当前是64636261;
ax是eax的后16位,即6261
Al为61; AH是62。
其他ebx、ecx、edx中也有与同样的bx、bl、bh等对应的寄存器,原理与上述相同。
关于用途,分别有默认的用途。
Eax保存所有API函数的返回值。
寄存器AX和AL通常称为累加器,在累加器中执行操作可能需要更少的时间。 累加器可用于乘法、除法、输入输出等操作,它们使用频率高;
寄存器BX称为基地址寄存器(Base Register )。 它可以用作内存指针
寄存器CX称为计数寄存器(Count Register )。 循环和字符串操作用于控制循环的次数。 在位操作中,移位多个位时,用CL指定移位的位数。
将寄存器DX设置为数据寄存器(Da
ta Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。由于存储的数据大小关系,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址, 32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。(什么是基址,什么是变址以后会说到)
2个变址和指针寄存器(ESI和EDI)
32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
2个重要的指针寄存器(ESP和EBP)
这两个指针寄存器都和“栈”这个神秘的东东有关,那么什么是栈呢?这俩指针寄存器又有何作用呢?
从计算机科学的角度看,栈是一种数据结构,是一种先进后出的数据表。栈的最常见操作有两种:Push(入栈)和Pop(出栈)。
我们可以把栈想象成一摞扑克牌:
PUSH:为栈增加一个元素的操作是push,相当于在这摞扑克牌最上面再放一张
POP:从栈中取出一个元素的操作叫做POP,相当于从这摞扑克牌取出最上面的一
张。
TOP:标识栈顶位置,并且是动态变化的。每做一次PUSH 操作,它都会自增1;
相反,每做一次POP 操作,它会自减1。栈顶元素相当于扑克牌最上面一张,只有
这张牌的花色是当前可以看到的。
BASE:标识栈底位置,它记录着扑克牌最下面一张的位置。BASE 用于防止栈空后
继续弹栈(牌发完时就不能再去揭牌了)。很明显,一般情况下,BASE 是不会变动
的。
用xhdhk《汇编语言》中的图说明一下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是十六进制数
图中左边的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是栈底指针寄存器。