引數和返回值是函式的兩個重要組成部分,可以通過引數向函式傳入資訊,通過返回值使函式傳出資訊。看一段c語言**:
#include int function(int a, int b)
else
} int main()
這裡定義了乙個函式function(),引數是兩個整型變數,返回值也是整型變數,當a的值大於b時返回a,否則返回b,很明顯這個函式返回的是兩個數中的較大數,然後在主函式中呼叫了這個函式,引數分別為1、2。編譯後使用ida進行分析,主函式的反彙編**如下:
.text:00401020 push ebp
.text:00401021 mov ebp, esp
.text:00401023 push 2 ; b
.text:00401025 push 1 ; a
.text:00401027 call ?function@@yahhh@z ; function(int,int)
這裡向棧中壓入資料2和1,然後呼叫函式function(int,int)。可以猜想這樣向堆疊裡壓入2和1就是在給被呼叫的過程傳遞引數了。這裡要注意,傳遞引數的時候是反著來的,c語言裡呼叫的時候是function(1, 2),等到反彙編的時候就變成先壓入2,再壓入1這樣的了。
text:0040102c add esp, 8
這一句**用來抬高棧頂,抬高棧頂是為了平衡棧楨,前面為了給被呼叫過程傳遞引數向棧中壓入了兩個四位元組的int型變數,這裡把棧頂抬高八個位元組就是為了銷毀傳遞引數的痕跡。
.text:0040102f xor eax, eax
.text:00401031 pop ebp
.text:00401032 retn
下面是function()函式在ida中的分析結果:
.text:00401000 ; attributes: bp-based frame
.text:00401000
.text:00401000 ; int __cdecl function(int a, int b)
.text:00401000 ?function@@yahhh@z proc near ; code xref: _main+7 p
.text:00401000
.text:00401000 a = dword ptr 8
.text:00401000 b = dword ptr 0ch
.text:00401000
這裡是對function()函式的引數、返回值、呼叫方式等資訊的分析。這裡說明了function()函式的呼叫方式為__cdecl,返回值是int型,兩個引數a、b與ebp對應的偏移分別為0x08和0x0c。
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 mov eax, [ebp+a]
.text:00401006 cmp eax, [ebp+b]
.text:00401009 jle short loc_401012
.text:0040100b mov eax, [ebp+a]
.text:0040100e jmp short loc_401015
.text:00401010 jmp short loc_401015
.text:00401012 mov eax, [ebp+b]
.text:00401015 pop ebp
.text:00401016 retn
.text:00401016 ?function@@yahhh@z endp
一般來說過程返回的結果都是儲存在eax裡的。這個函式比較兩個引數a、b,如果引數a大於引數b則把引數a放到eax,跳到最後返回,如果引數a不大於引數b則把引數b放到eax中返回。
《軟體除錯分析技術》學習筆記(一)
今天開始寫寫一些心得體驗。軟體除錯分析技術 是好友monster的 作品。作為一直以的好夥伴,他是我看著長大的,嘻嘻 之所以有今天這樣的成績,是與他的努力和天賦脫不了關係的。他大方地給了我pdf版的,我也大方的給了我們全班。但我們班有同學說,這是撒子呦,看不看不懂 我決心寫一些學習筆記,和我班的同學...
《軟體除錯分析技術》學習筆記(二)
1.暫存器 暫存器m講的比較透徹。暫存器是 處理器cpu的組成部分,是有限存貯容量的高速存貯部件,它們可用來暫存指 令 資料和位址,是記憶體階層中的最頂端,也是系統獲得操作資料的最快速途徑。1.1資料暫存器 資料暫存器主要用來儲存運算元和運算結果等資訊,從而節省讀取運算元所需占用匯流排和訪問 儲存器...
《軟體除錯分析技術》學習筆記(三)
m給出乙個c程式 include include int a int main 這段 定義了乙個整型全域性變數a,在主函式main 中定義了乙個整型區域性變數b和乙個整形指標變數c,然後呼叫malloc 函式申請大小為1個整形變數的記憶體並把申請到的記憶體位址賦值給指標變數c,再依次給變數a b和c...