电子说
一般我们分析的程序大多都是32位的,所以这里就先介绍x86汇编,也就是32位下的汇编,64位下的汇编后续会介绍。
x86汇编一共有8个32位通用寄存器,名称分别为:EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI。
这些寄存器用来在程序运行过程中的算术运算和数据传输。其中EAX,EBX,ECX,EDX这四个寄存器又可以分为低16位,高8位和低8位,这样分的目的是为了传输不同字节大小的数据。
比如说一个字节的数据,也就是8位,那么就可以放到寄存器的低8位中;一个四字节 32位的数据,刚好就可以放到一个寄存器中。
下面是EAX,EBX,ECX,EDX这四个寄存器的低16位,高8位,低8位的表示方法
剩下的4个通用寄存器只能用32位和16位名称来访问
这些寄存器不需要死记硬背,在以后的分析过程中就会慢慢熟悉。
虽然这8个通用寄存器都是用来存储数据,但是还是有一些区别的:
EAX:乘除指令默认使用EAX寄存器保存结果数据;计算加法的时候结果也是保存在EAX中;函数调用完成后返回值也是默认保存在EAX中
imul:乘法指令
imul 操作数1,操作数2 ,表示操作数1*操作数2,并把结果放到操作数1中
可以看到下面的乘法操作都是用EAX保存结果
加法操作也是把结果放到EAX中
ECX:默认作为循环计数器,用来记录循环次数
EBP/ESP:这两个寄存器一般是用来记录栈的栈顶和栈底,EBP的值是指向栈底的指针,ESP的值是指向栈顶的指针
ESI/EDI:这两个寄存器大多是用在串操作指令中,比如字符串拷贝等操作
ESI就是扩展源变址寄存器(extended source index),EDI是扩展目的寄存器(extended destination index)
下面是一个字符串拷贝的汇编伪代码:
MOV ECX,EAX ;把字符串长度放到ECX中,用来计数
INC ECX ;因为有零字节,计数器+1
MOV ESI,SOURCE ;SOURCE 是源字符串的地址
MOV EDI,TARGET ;TARGET 是用来保存复制后字符串的地址,也就是目的字符串
CLD ;方向标志清零,ESI和EDI沿着正向(地址增大的方向)递增
;也就是字符串的处理是由前往后
REP MOVSB ;复制字符串,按字节传送数据
除了这8个通用寄存器外,还有一个寄存器使用的很多,这就是EIP(指令指针寄存器),这个寄存器的作用就是保存了下一条将要执行指令的地址,更改EIP的值可以改变程序的执行流程
8个通用寄存器加上一个指令指针寄存器EIP,这9个寄存器就是今后逆向过程中接触最多的寄存器了,在以后的使用过程中会慢慢对这些寄存器有更多了解。
全部0条评论
快来发表一下你的评论吧 !