汇编语言一些寄存器的作用

来源:互联网 发布:java 知识库系统 开源 编辑:程序博客网 时间:2024/05/18 04:50

首先,需要了解c语言中汇编语言里eax,ebx,ecx,edx,ebp,edi,esi;mov,sub,add,jmp,jn,test;push,pop,call,ret,lea;这些都是什么意思。

eax,ebx,ecx,edx,esi,edi,dbp... ...都是x86汇编语言中cpu上的通用寄存器的名称,是三十二位的寄存器。如果用c语言来解释,可以把这些寄存器当作变量来待。

x86是指三十二位操作系统。

三十二位寄存器有许多用途,但是每个都有自己的专长,有各自的特别之处。

eax 是 “累加器”,是很多加法乘法指令的缺省寄存器。

ebx 是“基地址”,寄存器,在内存寻地址时存放地址。

ecx 是计时器,是重复前缀指令和loop指令的内定计时器。

edx则是被用来放帧数除法产生的余数。

esi/edi分别叫做“源/目标索引寄存器”。

ebp是"基址指针",他最经常被用作高级语言函数调用的“框架指针”在破解的时候,经常可以看见一个标准的函数起始代码;

       push ebp;保存当前的ebp

       mov, ebp, esp ;ebp设为当前堆栈指针//mov(传送)a(累加寄存器)#30h(十六进制立即数) 将立即数30h(十六进制)传送到A里面。

              //堆栈指针:是一个抽象的数据类型,规定的两项必备的基本操作分别为入栈和出栈,并没有规定入栈和出栈要怎么实现。

       sub  ,esp,xxx;预留xxx字节给函数临时变量... ...

    这样一来,ebp构成了函数的框架,在ebp上方分别是原来的ebp,返回地址和参数,ebp下面则是临时变量,函数返回是用作mov,esp,ebp/pop ebp/ret即可。

esp专门用作堆栈指针,被形象的称为栈顶指针,栈顶顶部是地址大小的区域,压入堆栈的数据愈多,esp也就越小。三十二平台上,esp每次减少四字节。

jmp 是汇编语言中的无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出。

test指令属于逻辑运算指令,不送回操作结果,二仅仅影响标志位。

lea指令的功能是将源操作数、即储存单元的有效地址(偏移地址)传送到目的操作数。lea有两个操作数。左边是目的操作数,表示操作结果保存在此,该指令目的的操作数只能是八个通用寄存器之一。右边的是源操作数,该指令的源操作数只能是一个存储单元,表达存储单元有多重寻址方式。

ret: 例如ret  8   意思是废除压入的eax,ebx;两个参数(两个寄存器占用了八个字节);并返回继续运行。

add是普通的加法指令,adc是带进位的加法指令。

call指令段内调用将指令指针ip入栈,调用先入栈段基址Cs,再入栈ip。call调用ret返回再将地址弹出,相关变量值改变。