上課老師會給你講函式的形參與實參的概念,前期基本上背誦,沒有真正理解。這裡寫乙個簡單的例子說明下。
測試用例如下:
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 全稱為 形式引數 由於它不是...