GNU內聯彙編

2021-06-01 04:50:53 字數 2045 閱讀 4286

組合語言---gcc內聯彙編

gcc支援在c/c++**中嵌入彙編**,這些**被稱作是"gcc inline asm"(gcc內聯彙編);

一、基本內聯彙編

gcc中基本的內聯彙編非常易懂,格式如下:

__asm__ [__volatile__] ("instruction list");

其中,1.__asm__:

它是gcc定義的關鍵字asm的巨集定義(#define __asm__ asm),它用來宣告乙個內聯彙編表示式,所以,任何乙個內聯彙編表示式都以它開頭,它是必不可少的;如果要編寫符合ansi c標準的**(即:與ansi c相容),那就要使用__asm__;

2.__volatile__:

它是gcc關鍵字volatile的巨集定義;這個選項是可選的;它向gcc宣告"不要動我所寫的instruction list,我需要原封不動地保留每一條指令";如果不使用__volatile__,則當你使用了優化選項-o進行優化編譯時,gcc將會根據自己的判斷來決定是否將這個內聯彙編表示式中的指令優化掉;如果要編寫符合ansi c標準的**(即:與ansi c相容),那就要使用__volatile__;

3.instruction list:

它是彙編指令列表;它可以是空列表,比如:__asm__ __volatile__("");或__asm__("");都是合法的內聯彙編表示式,只不過這兩條語句什麼都不做,沒有什麼意義;但並非所有"instruction list"為空的內聯彙編表示式都是沒意義的,比如:__asm__("":::"memory");就是非常有意義的,它向gcc宣告:"我對記憶體做了改動",這樣,gcc在編譯的時候,就會將此因素考慮進去;

例如:__asm__("movl %esp,%eax");

或者是__asm__("movl $1,%eax

xor %ebx,%ebx

int $0x80");

或者是__asm__("movl $1,%eax\n\t"\

"xor %ebx,%ebx\n\t"\

"int $0x80");

instruction list的編寫規則:當指令列表裡面有多條指令時,可以在一對雙引號中全部寫出,也可將一條或多條指令放在一對雙引號中,所有指令放在多對雙引號中;如果是將所有指令寫在一對雙引號中,那麼,相鄰倆條指令之間必須用分號";"或換行符(\n)隔開,如果使用換行符(\n),通常\n後面還要跟乙個\t;或者是相鄰兩條指令分別單獨寫在兩行中;

規則1:任意兩條指令之間要麼被分號(;)或換行符(\n)或(\n\t)分隔開,要麼單獨放在兩行;

規則2:單獨放在兩行的方法既可以通過\n或\n\t的方法來實現,也可以真正地放在兩行;

規則3:可以使用1對或多對雙引號,每1對雙引號裡面可以放1條或多條指令,所有的指令都要放在雙引號中;

例如,下面的內聯彙編語句都是合法的:

__asm__("movl %eax,%ebx

stipopl %edi

subl %ecx,%ebx");

__asm__("movl %eax,%ebx; sti

popl %edi; subl %ecx,%ebx");

__asm__("movl %eax,%ebx; sti\n\t popl %edi

subl %ecx,%ebx");

如果將指令放在多對雙引號中,則,除了最後一對雙引號之外,前面的所有雙引號裡的最後一條指令後面都要有乙個分號(;)或(\n)或(\n\t);比如,下面的內聯彙編語句都是合法的:

__asm__("movl %eax,%ebx

sti\n"

"popl %edi;"

"subl %ecx,%bx");

__asm__("movl %eax,%ebx; sti\n\t"

"popl %edi; subl %ecx,%ebx");

__asm__("movl %eax,%ebx; sti\n\t popl %edi\n"

"subl %ecx,%ebx");

二、帶有c/c++表示式的內聯彙編

GNU 內聯彙編

gnu的c編譯器使用asm關鍵字 asm段格式如下 asm assembly code 一些彙編器使用製表符字元縮排指令以便區分和標籤。gnu編譯器不需要這樣做,單為保持一致使用這樣方式。asm mov 1,eax n tmov 0,ebx n tint 0x80 這樣格式有些混亂,下面這樣方式書寫...

彙編 div Solidity內聯彙編

在用solidity開發以太坊智慧型合約時,使用彙編可以直接與evm互動,降低gas開銷成本,更精細的控制智慧型合約的行為,因此值得solidity開發者學習並加以利用。本文是solidity彙編開發的簡明教程,旨在幫助你快速熟悉如何在solidity智慧型合約 中嵌入彙編 以太坊虛擬機器evm有自...

ARM彙編和Gnu彙編的轉換

將 arm ads 下的彙編碼移植到 gcc for arm 編譯器時,有如下規則 1,注釋行以 或 代替 2,get 或 include include 如 get option.a include option.a 3,equ equ tclk2 equ pb25 equ tclk2,pb25 ...