在汇编程序中调用C函数
一、參數如何傳遞
匯編程序調用C函數時,函數的入口參數使用棧來傳送,參數的傳遞順序是從右到左。即函數最后(最右邊的)一個參數先入棧,而最左邊的第一個參數最后入棧,然后執行 CALL 指令去調用C函數。
二、參數的清除
在C函數返回后,匯編程序需要把先前壓入棧中的函數參數清除掉,即調用者負責清除參數占用的棧空間。
比如要調用的C函數和要傳遞的參數是printSomething (arg1, arg2, arg3, arg4);
那么在匯編程序中應該這樣寫:
三、返回值的傳遞
C函數的返回值如果是32位整數,則保存在eax寄存器;如果是64位整數,則保存在edx:eax寄存器。
四、關于返回地址
在執行CALL指令時,CPU會把CALL指令的下一條指令的地址(返回地址)壓入棧中(見圖中 EIP)。
五、關于棧的切換
如果調用還涉及到代碼特權級變化,那 么CPU還會進行棧切換,這個過程就比較復雜了。可以參考我的博文:通過調用門進行控制轉移
注意:Linux內核中只使用中斷門和陷阱門方式處理特權級變化時的調用情況,并沒有使用CALL指令來處理特權級變化的情況。
六、用JMP指令代替CALL指令
我們可以不用CALL指令而采用JMP指令來同樣達到調用C函數的目的。方法是:在所有參數入棧后,人工把下一條要執行的指令的地址(返回地址)壓入棧中,然后直接使用JMP指令跳轉到被調用函數的入口地址去執行。當被調用函數執行其最末尾的ret指令時,就會把我們人工壓入棧中的返回地址彈出到EIP寄存器中,使執行流程返回到主函數。
參考資料
《Linux內核完全剖析》(趙炯,機械工業出版社,2006)
總結
以上是生活随笔為你收集整理的在汇编程序中调用C函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java程序的调试过程
- 下一篇: 百万数据php7取出循环_PHP7带来了