大神洗禮第四講 函式相關及程式設計技巧

2021-09-08 09:04:54 字數 2445 閱讀 8140

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

int_declspec (naked) myfunc()215

16_asm

1920

_asm 28}

29

在main函式呼叫的結果printf("%d\n", myfunc());

練習:

< 1 >、無引數的情況(不在堆疊上展開)

1

void _declspec (naked) blankfunc(void)211

}12

< 2 >、有引數的情況(在堆疊上展開)

1

int 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,但是為...