介绍8个32位通用寄存器

电子说

1.3w人已加入

描述

一般我们分析的程序大多都是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位的表示方法

ESP

剩下的4个通用寄存器只能用32位和16位名称来访问

ESP

这些寄存器不需要死记硬背,在以后的分析过程中就会慢慢熟悉。

虽然这8个通用寄存器都是用来存储数据,但是还是有一些区别的:

EAX:乘除指令默认使用EAX寄存器保存结果数据;计算加法的时候结果也是保存在EAX中;函数调用完成后返回值也是默认保存在EAX中

imul:乘法指令

imul 操作数1,操作数2 ,表示操作数1*操作数2,并把结果放到操作数1中

可以看到下面的乘法操作都是用EAX保存结果

ESP

ESP

ESP

ESP

加法操作也是把结果放到EAX中

ESP

ESP

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个寄存器就是今后逆向过程中接触最多的寄存器了,在以后的使用过程中会慢慢对这些寄存器有更多了解。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分