簡體   English   中英

從編譯器到匯編器

[英]From Compiler to assembler

我對匯編器有疑問。 我在考慮將多個參數作為參數的C函數如何轉換為程序集。 所以我的問題是,匯編中是否有一個以參數為參數進行操作的子程序? 該代碼可能看起來像這樣:

呼叫label1,R16。 其中R16是子例程輸入參數。

如果不是這種情況,則意味着每次調用C函數時,它都會被匯編成一個子例程,該子例程中將自動替換與特定調用相關的參數。 這基本上意味着,每當調用C函數時,編譯器都會將其轉換為內聯函數,這肯定不是這種情況:D

那哪個是對的? 非常感謝! :)

編譯器使用一種“調用約定”,該約定對於該一種目標體系結構(x86,arm,mips,pdp-11等)而言可能特定於該編譯器。 對於具有“大量”通用寄存器的體系結構,調用約定通常從在寄存器中傳遞參數開始,然后使用堆棧;對於沒有很多寄存器的體系結構,如果不完全用於參數傳遞和返回,則堆棧主要用於。

調用約定是一組規則,因此,如果每個人都遵循規則,則可以將函數編譯為對象並將其與其他對象鏈接,它們將能夠彼此調用函數或自行調用。

因此,這與您的假設有點混雜。 在某些方面,為該函數構建的代碼是該函數的自定義,因為參數的數量和類型決定了哪個寄存器或消耗了多少堆棧以及如何使用。 同時,所有函數都遵循相同的公式,因此它們看起來相似而不是不同。

例如,在arm上,您可能會將三個整數傳遞給函數,對於我見過的所有arm調用約定,它們都會被使用(通常,您會發現,即使它們在編譯器之間可能有所不同,但通常不會,對於arm和mips和其他一些方法,他們試圖為每個人(而不是試圖這樣做的編譯器人員)規定慣例)C函數中的第一個參數將出現在r0中,第二個出現在r1中,而第三個出現在r2中。 如果第一個參數是64位整數,則將r0和r1用於第一個參數,將r2獲取第二個參數,將r3用作第三個參數,在使用堆棧后,按慣例,堆棧中參數的順序也受規定。 因此,當使用相同的C原型編譯調用方或被調用方的代碼時,雙方都確切地知道在哪里可以找到參數並構造匯編語言來做到這一點。

在某些指令集中可能有一些最小的選項,但通常情況並非如此。

盡管一些匯編程序具有模仿程序調用的宏(通常只有少數可注冊的基本類型),但它們仍具有宏。

不,僅在使用內聯函數的情況下,才會生成新函數,其參數將替換為參數。

編譯器不會通過文本的參數替換來為過程生成代碼,而是通過將所有相關參數以固定的方式(稱為“調用約定”)放入寄存器或堆棧中來生成。

每次調用都會生成用於計算和加載參數(在寄存器中或堆棧上)的代碼,並且過程/函數保持不變,並且從知道可以找到它們的位置加載參數

暫無
暫無

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

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