內聯彙編

內聯彙編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 C 變數顯示出來。本例中,彙編程式模板由彙編指令組成。一個非常基本但很重要的區別在於 簡單內聯彙編只包括指令,而 擴展內聯彙編包括運算元。任何帶有一個 % 的數都看作是輸入/輸出運算元,而不認為是暫存器。

內聯彙編

GCC 為內聯彙編提供特殊結構,它具有以下格式:

GCG 的 "asm" 結構

asm ( assembler template

: output operands (optional)

: input operands (optional)

: list of clobbered registers

(optional)

);

本例中,彙編程式模板由彙編指令組成。輸入運算元是充當指令輸入運算元使用的 C 表達式。輸出運算元是將對其執行彙編指令輸出的 C 表達式。

內聯彙編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 C 變數顯示出來。因為它具有這種能力,所以 "asm" 可以用作彙編指令和包含它的 C 程式之間的接口。

一個非常基本但很重要的區別在於 簡單內聯彙編只包括指令,而 擴展內聯彙編包括運算元。要說明這一點,考慮以下示例:

內聯彙編的基本要素

{ int a=10, b; asm ("movl %1, %%eax; movl %%eax, %0;" :"=r"(b) /* output */ :"r"(a) /* input */ :"%eax"); /* clobbered register */}

在上例中,我們使用彙編指令使 "b" 的值等於 "a"。請注意以下幾點:

"b" 是輸出運算元,由 %0 引用,"a" 是輸入運算元,由 %1 引用。 "r" 是運算元的約束,它指定將變數 "a" 和 "b" 存儲在暫存器中。請注意,輸出運算元約束應該帶有一個約束修飾符 "=",指定它是輸出運算元。 要在 "asm" 內使用暫存器 %eax,%eax 的前面應該再加一個 %,換句話說就是 %%eax,因為 "asm" 使用 %0、%1 等來標識變數。任何帶有一個 % 的數都看作是輸入/輸出運算元,而不認為是暫存器。 第三個冒號後的修飾暫存器 %eax 告訴將在 "asm" 中修改 GCC %eax 的值,這樣 GCC 就不使用該暫存器存儲任何其它的值。 movl %1, %%eax 將 "a" 的值移到 %eax 中, movl %%eax, %0 將 %eax 的內容移到 "b" 中。 因為 "b" 被指定成輸出運算元,因此當 "asm" 的執行完成後,它將反映出更新的值。換句話說,對 "asm" 內 "b" 所做的更改將在 "asm" 外反映出來。

內聯彙編內聯彙編

更多圖冊

相關詞條

熱門詞條

聯絡我們