函式返回值

2021-07-04 03:04:25 字數 1735 閱讀 7390

這裡接著探求被調函式的返回值是如何傳遞到主調函式中的,下面為c程式。add函式通過直接返回a+b的,而add1函式先定義乙個區域性變數c,儲存a+b的值,然後再返回c的值。其中a+b可以當成乙個臨時變數,其結果是暫時存放在暫存器中的(eax)。參照反匯程式設計序,可以看出函式的值並不是通過壓棧、基址定址的方式傳遞到被調函式中的,而是暫存在暫存器中,然後再mov到主調函式的變數中的。

c程式

#include

int add(int a, int b)

int add1(int a, int b)

void main()

反彙編

c = add(a,b);

0104144c mov eax,dword ptr [b]

0104144f push eax

01041450

mov ecx,dword ptr [a]

01041453

push ecx

01041454

call @ilt+215(_add) (10410dch) //跳轉到被調函式

01041459

add esp,8

0104145c mov dword ptr [c],eax //將a+b的值傳遞到main函式的變數c中

@ilt+215(_add):

010410dc jmp

add (10413a0h)

int add(int a, int b)

010413c4 pop edi

010413c5 pop esi

010413c6 pop ebx

010413c7 mov esp,ebp

010413c9 pop ebp

010413ca ret

d = add1(a,b);

0104145f mov eax,dword ptr [b]

01041462

push eax

01041463

mov ecx,dword ptr [a]

01041466

push ecx

01041467

call @ilt+265(_add1) (104110eh)

0104146c add esp,8

0104146f mov dword ptr [d],eax //函式的返回值還是通過暫存器進行傳遞的

@ilt+265(_add1):

0104110e jmp add1 (10413e0h)

int add1(int a, int b)

0104140a pop edi

0104140b pop esi

0104140c pop ebx

0104140d mov esp,ebp

0104140f pop ebp

01041410

ret

函式返回值

一般說來,函式中是可以進行區域性變數的返回的,不然豈不是全部要用全域性變數,如果使用了全域性變數,那還有必要進行返回嗎?那函式就沒有它存在的意義了!但是要注意了,這裡所謂的區域性變數的返回很有內涵,什麼樣的值才可以進行返回而不出錯?其實,只要遵守一句話即可 函式不能返回指向棧記憶體的指標!為什麼?因...

函式返回值

現實生活中的場景 我給兒子10塊錢,讓他給我買包菸。這個例子中,10塊錢是我給兒子的,就相當於呼叫函式時傳遞到引數,讓兒子買菸這個事情最終的目標是,讓他把煙給你帶回來然後給你對麼,此時煙就是返回值 開發中的場景 定義了乙個函式,完成了獲取室內溫度,想一想是不是應該把這個結果給呼叫者,只有呼叫者擁有了...

函式返回值

一 返回值 def email print 我要發郵件 return 123 如果沒有返回值,預設返回none ret email print ret 如果函式執行成功,return後面是什麼值,ret等於返回值,就輸出什麼值 二 傳入引數,驗證手機號碼取快遞def kuaidi p if p 15...