1、引數傳遞問題:
< 1 >、堆疊傳參
< 2 >、暫存器傳參(利用通用暫存器進行函式引數傳遞的方法)
< 3 >、全域性變數或靜態變數傳參
2、 call convention(函式呼叫約定)
< 1 >、_cdecl
a、 引數從右向左壓入堆疊
b、 函式被呼叫者修改堆疊
c、 在win32應用程式裡,巨集apientry,winapi,都表示_stdcall,非常常見.
d、 c和c++程式的預設呼叫方式。每乙個呼叫它的函式都包含清空堆疊的**,所以產生的可執行檔案大小會比呼叫_stdcall函式的大。
< 2 >、_stdcall
a、 壓棧方式與_cdecl一樣,與之不一樣的是堆疊的平衡不是由函式呼叫者完成,而是自身完成,在退出時自己清空堆疊。
b、 此種方式在函式返回是以 ret 8 指令來平衡堆疊,此處:ret 8 = add esp , 8。
< 3 >、上兩種方式最為常用,此外還有fastcall ,thiscall, naked call,_pascal等 _pascal 入棧方式是從左到右。
下面通過一些例子來深入理解。
3、 跟蹤彙編**看函式引數的呼叫機制 我們看這樣乙個簡單的函式,
編譯器翻譯的彙編指令如下:
< 1 >、void test1(){}
1據此畫出記憶體布局圖為:void test1()214
013516fe
popedi
15013516ff
popesi
1601351700
popebx
1701351701
movesp,ebp
1801351703
popebp
1901351704
ret;--->編譯器預設為_cdecl
20
< 2 >、有引數的情況
1記憶體布布局如下:int _cdecl test (int i, intj)2
56int _cdecl test (int i, intj)7
27013116c9
popedi
28013116ca
popesi
29013116cb
popebx
30013116cc
movesp,ebp
31013116ce
popebp
32013116cf
ret33
34 00d21d88 push 2 ;在呼叫函式之前先將引數從右往左壓入堆疊
35 00d21d8a mov eax,dword ptr [i]
36 00d21d8d push
eax
3700d21d8e
call
test
(0d211f4h);函式呼叫
38 00d21d93 add esp,8 ;平衡堆疊
39 00d21d96 mov
dword ptr [i],eax
40
4、 編寫裸函式(不讓系統加彙編的**,而是人為的加上去)
比如:
1在main函式呼叫的結果printf("%d\n", myfunc());int_declspec (naked) myfunc()215
16_asm
1920
_asm 28}
29
練習:
< 1 >、無引數的情況(不在堆疊上展開)
1< 2 >、有引數的情況(在堆疊上展開)void _declspec (naked) blankfunc(void)211
}12
1int nest (int a, intb)2
7int _declspec (naked) myfunc(int a, intb)8
21_asm
28_asm 36}
37
第四講 虛擬化概念及相關知識介紹
一 虛擬化概念 虛擬化是雲計算非常關鍵的技術之一,虛擬化的含義很廣泛。將任何一種形式的資源抽象成另一種形式的技術都是虛擬化。在計算機方面,虛擬化一般指通過對計算機物理資源的抽象,提供乙個或多個操作環境,實現資源的模擬 隔離或共享等。當語言無法表達時,考慮上圖 虛擬化示意圖 虛擬化與雲計算的關係 虛擬...
SQL基礎第四講 分析函式之組內排序
sql基礎第四講 分析函式之組內排序 看python教程看的有點疲乏,還是寫點東西吧 為什麼說是簡講呢,其實分析函式在工作中用到的地方也是非常多的,但是它可以實現的方面有很多,這裡給大家講三方面 1.分組內排序 2.分組內求聚合 3.計算行與行資料之間的偏移量。ps 當你學會分析函式,相信我,你會愛...
web程式設計技術 第四講 XAMPP的安裝與配置
本講學習目標是讓同學能夠建立基於xampp的web伺服器,並能進行相關配置。xampp是一款開源 免費的網路伺服器軟體,經過簡單安裝後,就可以在個人電腦上搭建伺服器環境。xampp apache mysql php perl 是乙個功能強大的建站整合軟體包。這個軟體包原來的名字是 lampp,但是為...