簡體   English   中英

GCC內聯匯編到二進制

[英]GCC Inline Assembly to Binary

在C或C ++中,您可以通過執行以下操作來實現內聯匯編指令:

asm("assembly code");  

要么

__asm__ ("assembly code");  

例:

asm("movl %ebx, %eax"); /* moves the contents of ebx register to eax */
__asm__("movb %ch, (%ebx)"); /* moves the byte from ch to the memory pointed by ebx */

然后,您可以生成一個交互,以在匯編代碼和C / C ++變量之間交換值:有關更多信息,請參見

我的問題是:編譯器是否將每個內聯匯編指令直接轉換為其二進制對應指令? 還是這只是一種“模仿”? 這就是我想知道您是否實際上在訪問處理器的寄存器,或者代碼中處理的所有數據都存儲在堆棧中,以模擬匯編指令。 抱歉,問題很愚蠢。


當您使用'__asm__''asm'關鍵字時,GCC / G ++會將字符串解析為匯編指令。 如果您使用“擴展程序集” ,即在字符串后包含冒號,以使變量與寄存器的“輸入/輸出”交互,則內聯匯編程序將進行簡單替換,如以下示例所示:


__asm__(“ \\
添加%ebx,%eax; \\
mov%ebx,%ecx; \\
“:” = c“(output_variable):” b“(first_operand),” a“(second_operand):/ *這里不需要* /);

注意每條裝配線末端的反斜杠。 它是為了避免跳行,以便使用一對引號包圍所有匯編代碼。 另外,為了幫助內聯匯編解析器,每個匯編指令必須以分號結尾


在雙引號之間的指令之后,可以在前兩個之間添加三個冒號,然后聲明將要接收輸出的變量。 請注意, “ = c”(output_variable)表示最后存儲在ecx寄存器中的值將被轉發到()之間的變量。

在最后兩個冒號之間,聲明要用作輸入的變量/值,因此在代碼開始時,括號之間的值分配給用引號之間的字母表示的寄存器(使用逗號代替一個輸入)。

在最后一個冒號之后,列出了被破壞的寄存器。 但是,這是可選的,在這種特殊情況下沒有用。 有關整個GCC內聯匯編的更多信息,請點擊此處

因此,總的來說,執行過程如下:

  • 將輸入值(如果有)替換為相應的寄存器
  • 從匯編轉換為二進制
  • 將輸出加載到分配的變量(如果有)中

因此簡短的答案是肯定的 ,一旦代碼被編譯成機器語言,轉換將是一對一的,就像普通的匯編器一樣,因此它將使用實數寄存器。


暫無
暫無

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

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