在組譯工具中調用C函數__PHP

來源:互聯網
上載者:User
一、參數如何傳遞

組譯工具調用C函數時,函數的入口參數使用棧來傳送,參數的行程順序是從右至左。即函數最後(最右邊的)一個參數先入棧,而最左邊的第一個參數最後入棧,然後執行 CALL 指令去調用C函數。 二、參數的清除

在C函數返回後,組譯工具需要把先前壓入棧中的函數參數清除掉,即調用者負責清除參數佔用的棧空間。

比如要調用的C函數和要傳遞的參數是printSomething (arg1, arg2, arg3, arg4);
那麼在組譯工具中應該這樣寫:

pushl arg4pushl arg3pushl arg2pushl arg1call  printSomethingaddl  $0x10, %esp
三、傳回值的傳遞

C函數的傳回值如果是32位整數,則儲存在eax寄存器;如果是64位整數,則儲存在edx:eax寄存器。 四、關於返回地址

在執行CALL指令時,CPU會把CALL指令的下一條指令的地址(返回地址)壓入棧中(見圖中 EIP)。

五、關於棧的切換

如果調用還涉及到代碼特權級變化,那 麼CPU還會進行棧切換,這個過程就比較複雜了。可以參考我的博文:通過調用門進行控制轉移

注意:Linux核心中只使用中斷門和陷阱門方式處理特權級變化時的調用情況,並沒有使用CALL指令來處理特權級變化的情況。 六、用JMP指令代替CALL指令

我們可以不用CALL指令而採用JMP指令來同樣達到調用C函數的目的。方法是:在所有參數入棧後,人工把下一條要執行的指令的地址(返回地址)壓入棧中,然後直接使用JMP指令跳轉到被調用函數的入口地址去執行。當被調用函數執行其最末尾的ret指令時,就會把我們人工壓入棧中的返回地址彈出到EIP寄存器中,使執行流程返回到主函數。

參考資料

《Linux核心完全剖析》(趙炯,機械工業出版社,2006)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.