一般我們分析的程序大多都是32位的,所以這里就先介紹x86匯編,也就是32位下的匯編,64位下的匯編后續(xù)會介紹。
x86匯編一共有8個32位通用寄存器,名稱分別為:EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI。
這些寄存器用來在程序運行過程中的算術(shù)運算和數(shù)據(jù)傳輸。其中EAX,EBX,ECX,EDX這四個寄存器又可以分為低16位,高8位和低8位,這樣分的目的是為了傳輸不同字節(jié)大小的數(shù)據(jù)。
比如說一個字節(jié)的數(shù)據(jù),也就是8位,那么就可以放到寄存器的低8位中;一個四字節(jié) 32位的數(shù)據(jù),剛好就可以放到一個寄存器中。
下面是EAX,EBX,ECX,EDX這四個寄存器的低16位,高8位,低8位的表示方法
剩下的4個通用寄存器只能用32位和16位名稱來訪問
這些寄存器不需要死記硬背,在以后的分析過程中就會慢慢熟悉。
雖然這8個通用寄存器都是用來存儲數(shù)據(jù),但是還是有一些區(qū)別的:
EAX:乘除指令默認使用EAX寄存器保存結(jié)果數(shù)據(jù);計算加法的時候結(jié)果也是保存在EAX中;函數(shù)調(diào)用完成后返回值也是默認保存在EAX中
imul:乘法指令
imul 操作數(shù)1,操作數(shù)2 ,表示操作數(shù)1*操作數(shù)2,并把結(jié)果放到操作數(shù)1中
可以看到下面的乘法操作都是用EAX保存結(jié)果
加法操作也是把結(jié)果放到EAX中
ECX:默認作為循環(huán)計數(shù)器,用來記錄循環(huán)次數(shù)
EBP/ESP:這兩個寄存器一般是用來記錄棧的棧頂和棧底,EBP的值是指向棧底的指針,ESP的值是指向棧頂?shù)闹羔?/p>
ESI/EDI:這兩個寄存器大多是用在串操作指令中,比如字符串拷貝等操作
ESI就是擴展源變址寄存器(extended source index),EDI是擴展目的寄存器(extended destination index)
下面是一個字符串拷貝的匯編偽代碼:
MOV ECX,EAX ;把字符串長度放到ECX中,用來計數(shù)
INC ECX ;因為有零字節(jié),計數(shù)器+1
MOV ESI,SOURCE ;SOURCE 是源字符串的地址
MOV EDI,TARGET ;TARGET 是用來保存復(fù)制后字符串的地址,也就是目的字符串
CLD ;方向標志清零,ESI和EDI沿著正向(地址增大的方向)遞增
;也就是字符串的處理是由前往后
REP MOVSB ;復(fù)制字符串,按字節(jié)傳送數(shù)據(jù)
除了這8個通用寄存器外,還有一個寄存器使用的很多,這就是EIP(指令指針寄存器),這個寄存器的作用就是保存了下一條將要執(zhí)行指令的地址,更改EIP的值可以改變程序的執(zhí)行流程
8個通用寄存器加上一個指令指針寄存器EIP,這9個寄存器就是今后逆向過程中接觸最多的寄存器了,在以后的使用過程中會慢慢對這些寄存器有更多了解。
-
寄存器
+關(guān)注
關(guān)注
31文章
5225瀏覽量
118948 -
計數(shù)器
+關(guān)注
關(guān)注
32文章
2229瀏覽量
93819 -
ESP
+關(guān)注
關(guān)注
0文章
176瀏覽量
33685
發(fā)布評論請先 登錄
相關(guān)推薦
評論