簡體   English   中英

C和匯編如何工作?

[英]C and assembly how can it work?

我想知道如何將 C 和匯編混合在一起,因為編譯器以不同的方式生成代碼,例如,許多 C 編譯器將使用寄存器而不是在進行函數調用時推送到堆棧,然后這些函數會將這些寄存器移動到適當的內存中因此,如果您編寫匯編代碼或鏈接由不同編譯器創建的對象文件,該對象文件將調用 C 函數,而是將參數推送到堆棧而不是設置寄存器,該怎么辦。

我的猜測是 C 編譯器的匯編輸出以一種非常聰明的方式完成了它,它沒有任何區別,它仍然可以工作,但我不能確定查看匯編代碼它似乎不會工作。

任何人都可以在我編寫編譯器並且需要知道這一點時回答我的問題,因此如果我將來想與 C 模塊鏈接,我就不會犯任何錯誤。

用於調用函數的約定是所謂的“應用程序二進制接口”(ABI) 的一部分。 如果指定了這個接口,那么所有遵循規范的代碼都可以鏈接在一起。

沒有用於 C 的標准 ABI。但是,大多數流行的平台都有一個流行的 C 編譯器,可以有效地生成事實上的標准 ABI(例如,有一個用於 Windows,一個用於 x86(32 位和 64 位)上的 Linux,一個用於 Linux on ARM 等)。 ABI 可能會指定大量單獨的“調用約定”,並且您的 C 編譯器通常會讓您在使用某些供應商擴展的函數聲明點指定所需的約定。

相反,如果您的 C 編譯器或目標代碼的現有位沒有記錄的 ABI,那么您通常無法成功鏈接(或以其他方式交互)它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM