[英]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.