日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

在汇编程序中调用C函数

發(fā)布時(shí)間:2025/3/15 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在汇编程序中调用C函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、參數(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ù)占用的棧空間。

比如要調(diào)用的C函數(shù)和要傳遞的參數(shù)是printSomething (arg1, arg2, arg3, arg4);
那么在匯編程序中應(yīng)該這樣寫(xiě):

pushl arg4 pushl arg3 pushl arg2 pushl arg1 call printSomething addl $0x10, %esp

三、返回值的傳遞

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ù)雜了。可以參考我的博文:通過(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。