chinese:
1、位址 指標 引用
c++中位址標號用16進製表示,取乙個變數位址使用&操作符,只有變數才存在記憶體位址,常量沒有位址(不包括const定義的偽常量)
指標是一種資料型別,用於儲存各種資料型別在記憶體中的位址。指標變數也可以取出位址,所以會出現多級指標。
c++中引用不可以單獨定義,定義的時候必須初始化。引用表示乙個變數的別名,對它的任何操作,本質都是在操作它所表示的變數。
2、指標和位址的區別
指標是變數,用於儲存變數位址;位址是常量,是記憶體標號。
指標可修改,可以再次儲存其他的變數位址;位址不可修改。
指標可以對其執行取位址操作得到位址;位址不可執行取位址操作。
指標包含對儲存位址的解釋資訊;位址無法解釋資料。
3、各型別指標的工作方式
通過c++的反彙編指令進行描述
// c++ code:int nvar = 0x12345678;
;為位址賦值4位元組資料12345678h
movdword ptr [ebp-10h], 12345678h
// c++
code:
int *pnvar = &nvar;
leaecx, [ebp-10h]
movdword ptr [ebp-14h], ecx
// c++
code:
char *pcvar = (char*)&nvar
;lea
edx, [ebp-10h]
movdword ptr [ebp-18h], edx
// c++
code:
short *psnvar = (short*)&nvar
;lea
eax, [ebp-10h]
movdword ptr [ebp-1ch], eax
// c++
code:
printf(
"%08x
", *pnvar);
;取出pnvar中儲存的位址值並放入ecx中
movecx, dword ptr [ebp-14h]
movedx, dword ptr [ecx]
;printf函式呼叫部分略
// c++
code:
printf(
"%08x
", *pcvar);
;取出pcvar中儲存的位址值並放入eax中
moveax, dword ptr [ebp-18h]
;從eax儲存的位址中,以1位元組方式讀取資料,存入ecx中
movsx
ecx, byte ptr [eax]
// c++
code:
printf(「%08x
", *psnvar);
;取出psnvar中儲存的位址並放入edx中
mov edx, dword ptr [ebp-1ch]
;從edx儲存的位址中,以2位元組的方式讀取資料,存入eax中
movsx eax, word ptr [edx]
可見指標型別會按照指標型別對位址資料進行解釋。去內容操作一般分為兩個步驟,先取出指標中儲存的位址資訊,然後針對這個位址取內容,也就是乙個間接定址的過程,這也是識別指標的重要依據。
4、了解引用的內部工作原理
實際上引用型別就是指標型別,只不過它用於存放位址的記憶體空間對使用者而言是隱藏的。
// c++ codeint nvar = 0x12345678;
mov dword ptr [ebp-4
], 12345678h
// c++ code
int &nvartype = nvar;
;取出變數nvar的位址放入eax中
lea eax, [ebp-4];
將變數nvar的位址存入位址ebp-8處,這個ebp-8處便是引用型別nvartype的位址
;從這條彙編語句中可以得出結論,引用型別在記憶體中是占有一席之地的
mov dword ptr [ebp-8] eax;
//呼叫函式add,add的引數為int引用型別,將變數nvar作為引數傳遞
add(nvar);
;取出變數nvar的位址放入ecx
lea ecx, [ebp-4];
將ecx作為引數入棧,也就是傳遞變數nvar的位址作為引數
push ecx;
;函式呼叫的指令略
call @ilt+15 (add) (00401014
)add esp, 4
引用型別的儲存方式和指標是一樣的,都是使用記憶體空間存放位址。引用只是通過編譯器實現定址,而指標需要手動定址。
引用型別也可以作為函式的引數型別和返回型別使用。因為引用實際上就是指標,所以它同樣會在引數傳遞時產生乙份拷貝。
// c++ codevoid
add(int
&nvar)
;取出引數nvar中的內容放入eax中
mov eax, dword ptr [ebp+8];
對eax執行取內容操作
movecx, dword ptr [eax]
add ecx, 1
mov edx, dword ptr [ebp+8
]mov
dword ptr [edx], ecx
ret
從彙編**中可以看出,引用型別的引數也佔記憶體空間,其中儲存的資料是乙個位址值。取出這個位址中的資料並加1,再將+1後的結果放回。因此,在反彙編下,沒有引用這種資料型別。
C 反彙編學習筆記(一)
chinese c 整數與浮點數的儲存方式 1 整數型別 無符號整數的所有位都用來表示數值,有符號整數的最高位是符號位,其餘位以補碼格式儲存。補碼規則就是用0減去這個數的絕對值 取反加一 首先我們知道x x 反碼 0xffffffff,因此x x 反碼 1 0,因此x 補碼 0 x x 反碼 1。補...
學習筆記 2011 07 03 反彙編
include using namespace std int main 00c514e6 jmp main 27h 0c514a7h int a 0 00c514e8 mov dword ptr a 0 return 0 00c514ef xor eax,eax 00c514f1 pop edi ...
彙編學習筆記 對抗反彙編實驗2019092801
使用相連的jz和jnz指令跳轉到緊接著jnz指令的call指令的第二個位元組。call指令實際上無效。驗證ida在反彙編時會識別出call指令。作業系統 windows 7 安裝於virtualbox中的虛擬機器 編輯器 sublime text 3 編譯器 masm32 除錯 反彙編工具 olly...