首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

GCC 內聯彙編語法完整指南

     編輯:關於C語言

GCC 內聯彙編語法完整指南

GCC 支援在 C 代碼中嵌入彙編指令,適用於:硬體端口訪問(in/out)、特權指令、極致優化、裸機開發。本文詳解基本格式、完整約束語法、輸入輸出操作數綁定、寄存器保護列表。

最簡單格式

__asm__("nop");                    // 單條指令
__asm__("movl $1, %eax\n\t"       // 多條指令用 \n\t 分隔
        "movl $4, %ebx\n\t"
        "int $0x80");

完整約束語法(四部曲)

__asm__( assembler_template
       : output_operands   /* 可選 */
       : input_operands    /* 可選 */
       : clobbered_regs    /* 可選 */
       );
  • assembler_template:彙編指令模板,操作數用 %0, %1… 佔位,對應輸出/輸入列表順序。
  • output_operands:"=r" (var),= 表示寫入,r 表示通用寄存器約束,var 為 C 左值表達式。
  • input_operands:"r" (expr),r 表示讀取,expr 為 C 表達式。
  • clobbered_regs:"cc", "memory", "%eax",告知編譯器哪些寄存器/狀態旗標/內存被修改,編譯器避開分配或重新加載。

實例:原子交換(x86 xchg)

static inline int atomic_xchg(volatile int *ptr, int newval) {
    int result;
    __asm__ __volatile__(
        "xchgl %0, %1"
        : "=r" (result), "+m" (*ptr)
        : "0" (newval)
        : "memory"
    );
    return result;
}
  • __volatile__ 防止編譯器優化調整順序/刪除。
  • "+m" (*ptr):輸出輸入同用一個操作數(讀修寫),m 表示內存操作數。
  • "0" (newval):輸入操作數綁定到輸出操作數 0 的寄存器(%0)。
  • "memory":告知編譯器內存被修改,禁止重排內存訪問。

常用約束字母

字母含義
r通用寄存器
q低 8 位寄存器 (al,bl,cl,dl)
a/b/c/d/S/D特定寄存器 (eax/ebx/ecx/edx/esi/edi)
m內存操作數
g寄存器/內存/立即數任意
i/n立即數

修飾符

  • =:純輸出(寫入前值無關)。
  • +:輸入輸出(讀取舊值,寫入新值)。
  • &:早期剋制(該操作數在指令前被寫入,防止與其他輸入共用寄存器)。

x86 端口 I/O 範例

static inline unsigned char inb(unsigned short port) {
    unsigned char data;
    __asm__ __volatile__("inb %w1, %0" : "=a" (data) : "Nd" (port) : "memory");
    return data;
}
static inline void outb(unsigned short port, unsigned char data) {
    __asm__ __volatile__("outb %0, %w1" : : "a" (data), "Nd" (port) : "memory");
}

%w1 表示操作數 1 的字大小(16 位端口號),Nd 約束允許立即數或 dx 寄存器。

注意事項

  1. 內聯彙編破壞可移植性,僅在必要時使用。
  2. 寄存器分配完全由編譯器決定,不要假設具體寄存器(除非用显式約束 "a" 等)。
  3. clobber 列表務必完整,否則編譯器可能誤以為寄存器值未變,導致難以調試的錯誤。
  4. 大塊彙編建議寫獨立 .S 文件,用 extern 調用,保持 C 代碼整潔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved