導航:首頁 > 源碼編譯 > 編譯器內聯

編譯器內聯

發布時間:2025-05-01 11:14:19

❶ 內聯匯編的GNU 匯編程序簡述

Linux 中使用的基本匯編程序語法。GCC(用於 Linux 的 GNU C 編譯器)使用 AT&T 匯編語法。下面列出了這種語法的一些基本規則。 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 外反映出來。

閱讀全文

與編譯器內聯相關的資料

熱點內容
鏈接加密跳轉 瀏覽:253
android設置dialog寬度 瀏覽:965
程序員能學鋼琴嗎 瀏覽:906
單片機木頭 瀏覽:134
伺服器恢復正常了怎麼辦 瀏覽:429
網易雲游戲ios怎麼玩安卓渠道服 瀏覽:317
演算法時間復雜度可表示為 瀏覽:286
投標文件加密文件內存太大 瀏覽:584
初中習題庫哪個app好用 瀏覽:688
caxa編程助手23 瀏覽:20
python函數封裝加減乘除 瀏覽:553
加密基礎建設 瀏覽:663
安卓手機如何開到極限幀 瀏覽:65
mysql命令中文 瀏覽:757
程序員leetcode教學 瀏覽:921
哪裡有紅塵直播app下載 瀏覽:181
詩經注音pdf 瀏覽:782
pdfxchange下載 瀏覽:507
昨日收放量陰線公式源碼 瀏覽:596
android來電彈屏 瀏覽:622