1. 程式人生 > >彙編–從資料型別看WORD與DWORD

彙編–從資料型別看WORD與DWORD

剛接觸彙編與逆向,記錄一些學習筆記。

原始碼:

IDA彙編程式碼:

首先 1字=2位元組  1位元組=8位(8位元)=2位16進位制

var_6=dword ptr -6
ptr-6表示指標上移6個單位處,這裡的單位是指計算機的定址單位,一般按位元組定址,[EBP+var_6]就表示EBP-6個位元組的地址處。
DWORD 表示雙字,是對存入資料的說明。雙字=4位元組,也就是8位16進位制,也就是32位元(二進位制)。
mov [EBP+var_6] eax(eax的值為0x00000000,EAX為32位暫存器)表示的就是將0以雙字(4位元組)形式存入EBP-6地址處。雙字形式的0也就是8位16進位制的0,32位位元的0。那將佔用實際地址幾位呢?這裡牽扯到計算機的定址方式。一般以位元組進行定址,一個位元組2位16進位制。也就是說一個地址單元只能存8位元。
那mov [EBP+var_6] eax要存32位元,就存在了EBP-6,EBP-5,EBP-4,EBP-3四個地址單元上了。

var_2=word ptr -2
ptr-2表示指標上移2個單位處,這裡的單位同樣是位元組,[EBP+var_2]就表示EBP-2位元組處。這裡和DWORD是一樣的。
Word 表示單字=2位元組=16位元,是對存入資料的要求,也就是16位元。
mov [EBP+var_2] ax 表示的是將0以單位元組的形式存入EBP-2地址處,AX是取EAX的低16位。符合word(單字)的要求。
根據之前說的按位元組(4位16進位制=16位元)為單位定址,ax的值存入EBP-2和EBP-1處,這兩個地址單元。

short[4]=[100,]的生成
short型長度為2位元組,佔16位。彙編程式碼中的執行過程為:首先存入16位的0x64(100),即short[0],再存入32位的(0x00),實際上是兩個16位的0x00,即short[1]=0,short[2]=0,最後通過ax暫存器存入16位的0x00,即short[3]=0.
因此彙編程式碼中表面上只有兩步賦0操作。

OD中動態觀察:

初始狀態:

存入1字Word(雙位元組)的0x64

存入雙字DWORD(4位元組=8位16進位制)的0x00,賦值short[1]和short[2]

存入單字(雙位元組=4位16進位制)的0x00,short[3]=0

double型

double型佔8位元組(64位),在記憶體地址中佔8個單位。是分兩次存入的,一次賦值4個位元組的內容。之後的賦0操作略有不同,是通過一個迴圈實現的。

ECX=6表示迴圈6次,XOR EAX EAX 將EAX初始化為0從[EBP+var_50]開始向下迴圈6次,每次存入32為的0x00(EAX為32位)即4位元組,共24位元組的0,即為3個double型的0,。賦值完畢。