在汇编程序中调用C函数
一、參數(shù)如何傳遞
匯編程序調(diào)用C函數(shù)時(shí),函數(shù)的入口參數(shù)使用棧來(lái)傳送,參數(shù)的傳遞順序是從右到左。即函數(shù)最后(最右邊的)一個(gè)參數(shù)先入棧,而最左邊的第一個(gè)參數(shù)最后入棧,然后執(zhí)行 CALL 指令去調(diào)用C函數(shù)。
二、參數(shù)的清除
在C函數(shù)返回后,匯編程序需要把先前壓入棧中的函數(shù)參數(shù)清除掉,即調(diào)用者負(fù)責(zé)清除參數(shù)占用的??臻g。
比如要調(diào)用的C函數(shù)和要傳遞的參數(shù)是printSomething (arg1, arg2, arg3, arg4);
那么在匯編程序中應(yīng)該這樣寫(xiě):
三、返回值的傳遞
C函數(shù)的返回值如果是32位整數(shù),則保存在eax寄存器;如果是64位整數(shù),則保存在edx:eax寄存器。
四、關(guān)于返回地址
在執(zhí)行CALL指令時(shí),CPU會(huì)把CALL指令的下一條指令的地址(返回地址)壓入棧中(見(jiàn)圖中 EIP)。
五、關(guān)于棧的切換
如果調(diào)用還涉及到代碼特權(quán)級(jí)變化,那 么CPU還會(huì)進(jìn)行棧切換,這個(gè)過(guò)程就比較復(fù)雜了??梢詤⒖嘉业牟┪?#xff1a;通過(guò)調(diào)用門(mén)進(jìn)行控制轉(zhuǎn)移
注意:Linux內(nèi)核中只使用中斷門(mén)和陷阱門(mén)方式處理特權(quán)級(jí)變化時(shí)的調(diào)用情況,并沒(méi)有使用CALL指令來(lái)處理特權(quán)級(jí)變化的情況。
六、用JMP指令代替CALL指令
我們可以不用CALL指令而采用JMP指令來(lái)同樣達(dá)到調(diào)用C函數(shù)的目的。方法是:在所有參數(shù)入棧后,人工把下一條要執(zhí)行的指令的地址(返回地址)壓入棧中,然后直接使用JMP指令跳轉(zhuǎn)到被調(diào)用函數(shù)的入口地址去執(zhí)行。當(dāng)被調(diào)用函數(shù)執(zhí)行其最末尾的ret指令時(shí),就會(huì)把我們?nèi)斯喝霔V械姆祷氐刂窂棾龅紼IP寄存器中,使執(zhí)行流程返回到主函數(shù)。
參考資料
《Linux內(nèi)核完全剖析》(趙炯,機(jī)械工業(yè)出版社,2006)
總結(jié)
以上是生活随笔為你收集整理的在汇编程序中调用C函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java程序的调试过程
- 下一篇: 百万数据php7取出循环_PHP7带来了