一般我們分析的程序大多都是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個寄存器就是今后逆向過程中接觸最多的寄存器了,在以后的使用過程中會慢慢對這些寄存器有更多了解。
-
寄存器
+關注
關注
31文章
5390瀏覽量
121892 -
計數器
+關注
關注
32文章
2278瀏覽量
95421 -
ESP
+關注
關注
0文章
187瀏覽量
34232
發布評論請先 登錄
相關推薦
32位寄存器,32位寄存器是什么意思
IO口配置常用的8個寄存器 1.6

具有同步清除和3-St輸出的8位通用移位/存儲寄存器數據表

帶3態輸出的8位通用移位/存儲寄存器SN54F299 SN74F299數據表

評論