天天看點

彙編基礎

0x01 通用寄存器

寄存器是在記憶體中的

32位通用寄存器

EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI

EIP是存儲下次cpu下次要執行的指令,不能用作他用,是以不能是通用寄存器

0x02 MOV指令

1.立即數到寄存器

2.寄存器到寄存器

彙編其實本質就是寄存器和寄存器或者寄存器和記憶體之間資料的來回流動

彙編基礎

執行一下F8

彙編基礎

可以看到1這個立即數存放在這兩個寄存器去了,也可以把寄存器的值存放在寄存器裡面

MOV EDX,EAX

32位的:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI

16位的:AX,CX,DX,BX,SP,BP,SI,DI

8位的:AL,CL,DL,BL,AH,CH,DH,BH

隻有EAX,ECX,EDX,EBX有8位的,ESP,EBP,ESI,EDI沒有八位的

比如EAX等于FFFF0201,02就是AH,01就是AL

比如我們先把EAX設定為-1(FFFFFFFF)

我們在執行一下

MOV AX,1

現在EAX為FFFF0001,是以說其實一個寄存器我們你可以按照不同的段使用它,其實我們想用16位的寄存器其實就是把原來的一半給他了

現在我們想用8位的寄存器,把EAX設定為-1

MOV AL,2執行一下,EAX為FFFFFF02,可以看到隻變了8位一個位元組

0x03 記憶體

如果我們y要存儲的資料很多就單靠cpu中的寄存器是不夠的,每個應用程式都會有自己的獨立的4G記憶體空間

彙編基礎

假如我們記憶體隻有2G但是兩個程序加起來就8G了這明顯不科學,其實這裡可以了解為空頭支票,也就是說把這4G給你了,你可以在這裡面随便用,但是随便用意為着當你某個時刻真的要用作業系統就會把你擁的記憶體給映射到真正的記憶體裡面,實體記憶體也不是我們的所謂記憶體條,他們之間也存在這一個映射

0x04 記憶體位址

記憶體太大沒法起名字,是以隻能用編号。當我們想向記憶體中存儲資料,或者從記憶體中讀取資料時,必須用到編号,就想寫信必須要知道位址一樣

這個編号又稱為記憶體位址(32位,前面0可以省略),這個編号也叫記憶體位址

我們在寫入記憶體必須告訴它我們的寬度,比如mov 記憶體,1 我們必須告訴把這個1寫多大進去,比如我們寫如一位元組

mov byte ptr ds:[0049B000],1
           
彙編基礎

這裡的記憶體位址我們不能亂寫,因為必須要這個程式申請過了的才能使用,這裡有個小技巧,我們可以看這一塊的就是申請過的

彙編基礎

如果我們寫兩位元組就word,四位元組就dword

這裡我們是立即數寫到記憶體,現在來寄存器寫到記憶體

彙編基礎

可以看到寄存器EAX為0019FFCC

mov dword ptr ds:[0019FF74],eax
           
彙編基礎

可以看到記憶體位址為0019FF74也變成了EAX的值,我們可以把立即數寫入記憶體中,也可以把寄存器寫入記憶體中,前提就是資料長度必須一樣,如果前面是dword後面寫1也是一樣的,實際上1前面預設補了7個0,但是如果前面是DWORD後面是AX就不行了,但是編譯器會自動調整為WORD

記憶體一樣可以移動到寄存器

mov dword ptr ds:[0019FF74],eax
           
彙編基礎

但是不能直接記憶體到記憶體

0x05 記憶體位址的5種表示形式

1.形式一:【立即數】

讀取記憶體的值:

mov eax,dword ptr ds:[0x13ffc4]

向記憶體中寫入值:

mov dowrd ptr ds:[0x13ffc4],eax

2.形式二:【reg】reg代表寄存器,可以是8個通用寄存器中的任意一個

讀取記憶體的值

mov ecx,0x13FFD0

mov eax,dword ptr ds:[ecx]

向記憶體中寫入資料

mov edx,0x13FFD0

mov dword ptr ds:[edx],0x87654321

比如我們可以把EAX寫為0019FF74,然後再指令寫為MOV DWORD PTR DS:[EAX],12345678

執行結果如圖

彙編基礎

3.形式三:【reg+立即數】

mov eax,dword ptr ds:[ecx+4]

向記憶體中寫入資料:

mov edx,0x13FFD8

mov dword ptr ds:[edx+0xC],0x87654321

4.形式四【reg+reg{1,2,4,8}】

mov eax,13FFC4

mov ecx,2

mov edx,dword ptr ds:[eax+ecx4]

mov dword ptr ds:[eax+ecx*4],87654321

5.形式五【reg+reg{1,2,4,8}+立即數】

mov edx,dword ptr ds:[eax+ecx4+4]

mov dword ptr ds:[eax+ecx*4+4],87654321

0x06 資料的存儲模式

move byte ptr ds:[0x00000000],0x1A
move word ptr ds:[0x00000000],0x1A2C
move dword ptr ds:[0x00000000],0x1A2C3D4E
           

我們知道0x1A就是1A,但是0X1A2C是1A在上面還是2C在上面,是以這裡就分為兩類:

大端模式:資料高位在低位,資料低位在高位

小端模式:資料低位在低位,資料高位在高位

這裡的0x1A2C就是1A在高位,2C在低位,是以按照大端模式的話就是1A在上面2C在下面,按照小端模式的話最後一個從上到下的就是:

4E->3D->2C-1A

0x07 dtdebug一些操作

彙編基礎

檢視記憶體,比如說我想看19DBC4,假如我想看一個位元組就

db 19DBC4
           
彙編基礎

如果我們想兩個位元組的來檢視的話就

dw 19DBC4
           
彙編基礎

如果想4個位元組的來看

dd 19DBC4
           
彙編基礎

繼續閱讀