C語言基礎 形參與實參

2021-10-07 18:44:03 字數 3337 閱讀 6248

上課老師會給你講函式的形參與實參的概念,前期基本上背誦,沒有真正理解。這裡寫乙個簡單的例子說明下。

測試用例如下:

arm-linux-gcc test_para.c -o test_para 這裡用交叉編譯工具,方便後面讀彙編**

測試結果,很明顯real_swap_func才能達到交換的目的

簡單的說你得往變數的位址寫資料才能生效。形參只是往棧空間的某個位址寫了乙個資料,這個資料的值和入參的值相同,但是這個位址卻不是形參本身的位址。

先反彙編得到彙編**:

arm-linux-objdump -s test_para > test_para.txt

讀彙編再來深入理解:

00008490 :

8490: e1a0c00d mov ip, sp

8494: e92dd800 s***b sp!,

8498: e24cb004 sub fp, ip, #4 ; 0x4

849c: e24dd00c sub sp, sp, #12 ; 0xc

84a0: e50b0010 str r0, [fp, #-16]

84a4: e50b1014 str r1, [fp, #-20]

84a8: e51b3010 ldr r3, [fp, #-16]

84ac: e50b3018 str r3, [fp, #-24]

84b0: e51b3014 ldr r3, [fp, #-20]

84b4: e50b3010 str r3, [fp, #-16]

84b8: e51b3018 ldr r3, [fp, #-24]

84bc: e50b3014 str r3, [fp, #-20]

84c0: e24bd00c sub sp, fp, #12 ; 0xc

84c4: e89da800 ldmia sp,

000084c8 :

84c8: e1a0c00d mov ip, sp

84cc: e92dd800 s***b sp!,

84d0: e24cb004 sub fp, ip, #4 ; 0x4

84d4: e24dd00c sub sp, sp, #12 ; 0xc

84d8: e50b0010 str r0, [fp, #-16]

84dc: e50b1014 str r1, [fp, #-20]

84e0: e51b3010 ldr r3, [fp, #-16]

84e4: e5933000 ldr r3, [r3]

84e8: e50b3018 str r3, [fp, #-24]

84ec: e51b2010 ldr r2, [fp, #-16]

84f0: e51b3014 ldr r3, [fp, #-20]

84f4: e5933000 ldr r3, [r3]

84f8: e5823000 str r3, [r2]

84fc: e51b2014 ldr r2, [fp, #-20]

8500: e51b3018 ldr r3, [fp, #-24]

8504: e5823000 str r3, [r2]

8508: e24bd00c sub sp, fp, #12 ; 0xc

850c: e89da800 ldmia sp,

00008510 :

8510: e1a0c00d mov ip, sp

8514: e92dd800 s***b sp!,

8518: e24cb004 sub fp, ip, #4 ; 0x4

851c: e24dd008 sub sp, sp, #8 ; 0x8

8520: e3a03003 mov r3, #3 ; 0x3 //往r3暫存器寫0x3,也就是變數a的值

8524: e50b3010 str r3, [fp, #-16] //把r3的值寫入fp-16的棧位址上

8528: e3a03005 mov r3, #5 ; 0x5 //往r3暫存器寫0x5,也就是變數b的值

852c: e50b3014 str r3, [fp, #-20] //把r3的值寫入fp-20的棧位址上

8530: e51b0010 ldr r0, [fp, #-16] //從fp-16的棧位址的值往r0暫存器寫0x3,變數a的值

8534: e51b1014 ldr r1, [fp, #-20] //從fp-20的棧位址的值往r1暫存器寫0x5,變數b的值

8538: ebffffd4 bl 8490 //呼叫函式fake_swap_func,傳引數r0, r1 ,了解arm傳參機制

853c: e59f003c ldr r0, [pc, #60] ; 8580 <.text>

8540: e51b1010 ldr r1, [fp, #-16]

8544: e51b2014 ldr r2, [fp, #-20]

8548: ebffff90 bl 8390 <.text-0xc>

854c: e24b3010 sub r3, fp, #16 ; 0x10 //把fp-16的值(變數a的位址)寫入r3暫存器,這裡很重要

8550: e24b2014 sub r2, fp, #20 ; 0x14 //把fp-20的值(變數b的位址)寫入r2暫存器,這裡很重要

8554: e1a00003 mov r0, r3 //暫存器r3的值寫入r0,這時候r0存的是變數a的位址

8558: e1a01002 mov r1, r2 //暫存器r2的值寫入r1,這時候r1存的是變數 b的位址

855c: ebffffd9 bl 84c8 //呼叫函式fake_swap_func,傳引數r0, r1

8560: e59f0018 ldr r0, [pc, #24] ; 8580 <.text>

8564: e51b1010 ldr r1, [fp, #-16]

8568: e51b2014 ldr r2, [fp, #-20]

856c: ebffff87 bl 8390 <.text-0xc>

8570: e3a03000 mov r3, #0 ; 0x0

8574: e1a00003 mov r0, r3

8578: e24bd00c sub sp, fp, #12 ; 0xc

857c: e89da800 ldmia sp,

8580: 00008698 muleq r0, r8, r6

ps:8510 是main函式的位址,不知道為何不能顯示

形參與實參

形參與實參 函式的形參與實參 引數概念 a abcdef print len a 什麼是形參 def function1 a,b if a b print a else print b 什麼是實參 function1 1,3 引數的傳遞 第一種,最簡單的傳遞 def function a,b if ...

形參與實參

學習了引數那麼我們最先了解就是引數,而引數分為兩種,形參與實參,形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只在函式內部有效。函式呼叫結束返回主呼叫函式後則不能再使用該形參變數。實參可以是常量 變數 表示式 函式等,無論實參是何種型別的量,在進行函式呼...

形參與實參

實參 argument 全稱為 實際引數 是在呼叫時傳遞給函式的引數.實參可以是常量 變數 表示式 函式等,無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的 值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使實參獲得確定值。形參 parameter 全稱為 形式引數 由於它不是...