日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux C中内联汇编的语法格式及使用方法

發布時間:2024/4/18 linux 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux C中内联汇编的语法格式及使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在閱讀Linux內核源碼或對代碼做性能優化時,經常會有在C語言中嵌入一段匯編代碼的需求,這種嵌入匯編在CS術語上叫做inline assembly。本文的筆記試圖說明Inline Assembly的基本語法規則和用法(建議英文閱讀能力較強的同學直接閱讀本文參考資料中推薦的技術文章 ^_^)。

注意:由于gcc采用AT&T風格的匯編語法(與Intel Syntax相對應,二者的區別參見這里),因此,本文涉及到的匯編代碼均以AT&T Syntax為準。

1. 基本語法規則

內聯匯編(或稱嵌入匯編)的基本語法模板比較簡單,如下所示(為使結構更清晰,這里特意做了換行,其實完全可以全部寫到單行中):

?asm [ volatile ] (??
? ? ? ? assembler template
? ? ? ? [ : output operands ]? ? ? ? ? ? ? ? /* optional */
? ? ? ? [ : input operands? ]? ? ? ? ? ? ? ? /* optional */
? ? ? ? [ : list of clobbered registers ]? ? /* optional */
? ? ? ? );

備注:本文遵從linux系統的統一風格,以[ ]來表示其對應的內容為可選項。

由代碼模板可以看到,基本語法規則由5部分組成,下面分別進行說明。

1)關鍵字asm和volatile

asm為gcc關鍵字,表示接下來要嵌入匯編代碼。為避免keyword asm與程序中其它部分產生命名沖突,gcc還支持__asm__關鍵字,與asm的作用等價。

volatile為可選關鍵字,表示不需要gcc對下面的匯編代碼做任何優化。同樣出于避免命名沖突的原因,__volatile__也是gcc支持的與volatile等效的關鍵字。

BTW: C語言中也經常用到volatile關鍵字來修飾變量(不熟悉的同學,請參考這里)

2)assembler template

這部分即我們要嵌入的匯編命令,由于我們是在C語言中內聯匯編代碼,故需用雙引號""將命令括起來,以便gcc以字符串形式將這些命令傳給匯編器AS。例如可以寫成這樣:"movl %eax, %ebx"

有時候,匯編命令可能有多個,則通常分多行寫,每行的命令都用雙引號括起來,命令后緊跟"\n\t"之類的分隔符(當然,也可以只用1對雙引號將多行命令括起來,從語法來說,兩種寫法均有效,我們可自行決定用哪種格式來寫)。示例代碼如下所示:

__asm__ __volatile__ ( "movl %eax, %ebx\n\t"
? ? ? ? ? ? ? ? ? ? ? "movl %ecx, 2(%edx, %ebx, $8)\n\t"
? ? ? ? ? ? ? ? ? ? ? "movb %ah, (%ebx)"
? ? ? ? ? ? ? ? ? ? );

還有時候,根據程序上下文,嵌入的匯編代碼中可能會出現一些類似于魔數(Magic Number?)的操作數,比如下面的代碼:

? ? int a=10, b;
? ? asm ("movl %1, %%eax;? /* NOTICE: 下面會說明此處用%%eax引用寄存器eax的原因
? ? ? ? ? movl %%eax, %0;"
? ? ? ? ? :"=r"(b)? ? ? ? ? /* output 該字段的語法后面會詳細說明,此處可無視,下同 */
? ? ? ? ? :"r"(a)? ? ? ? ? /* input? */
? ? ? ? ? :"%eax"? ? ? ? ? /* clobbered register */
? ? ? ? );?

我們看到,movl指令的操作數(operand)中,出現了%1、%0,這往往讓新手摸不著頭腦。其實只要知道下面的規則就不會產生疑惑了:

在內聯匯編中,操作數通常用數字來引用,具體的編號規則為:若命令共涉及n個操作數,則第1個輸出操作數(the first output operand)被編號為0,第2個output operand編號為1,依次類推,最后1個輸入操作數(the last input operand)則被編號為n-1。

具體到上面的示例代碼中,根據上下文,涉及到2個操作數變量a、b,這段匯編代碼的作用是將a的值賦給b,可見,a是input operand,而b是output operand,那么根據操作數的引用規則,不難推出,a應該用%1來引用,b應該用%0來引用。

還需要說明的是:當命令中同時出現寄存器和以%num來引用的操作數時,會以%%reg來引用寄存器(如上例中的%%eax),以便幫助gcc來區分寄存器和由C語言提供的操作數。

3)output operands

該字段為可選項,用以指明輸出操作數,典型的格式為:

: "=a" (out_var)

其中,"=a"指定output operand的應遵守的約束(constraint),out_var為存放指令結果的變量,通常是個C語言變量。本例中,“=”是output operand字段特有的約束,表示該操作數是只寫的(write-only);“a”表示先將命令執行結果輸出至%eax,然后再由寄存器%eax更新位于內存中的out_var。關于常用的約束規則,本文后面會給出說明。

若輸出有多個,則典型格式示例如下:

? ? asm ( "cpuid"
? ? ? ? ? : "=a" (out_var1), "=b" (out_var2), "=c" (out_var3)
? ? ? ? ? : "a" (op)
? ? ? ? );

? 可見,我們可以為每個output operand指定其約束。

4)input operands

該字段為可選項,用以指明輸入操作數,其典型格式為:

: "constraints" (in_var)

其中,constraints可以是gcc支持的各種約束方式,in_var通常為C語言提供的輸入變量。

與output operands類似,當有多個input時,典型格式為:

: "constraints1" (in_var1), "constraints2" (in_var2), "constraints3" (in_var3), ...

當然,input operands + output operands的總數通常是有限制的,考慮到每種指令集體系結構對其涉及到的指令支持的最多操作數通常也有限制,此處的操作數限制也不難理解。此處具體的上限為max(10, max_in_instruction),其中max_in_instruction為ISA中擁有最多操作數的那條指令包含的操作數數目。

需要明確的是,在指明input operands的情況下,即使指令不會產生output operands,其:也需要給出。例如asm ("sidt %0\n" : :"m"(loc)); 該指令即使沒有具體的output operands也要將:寫全,因為有后面跟著: input operands字段。

5)list of clobbered registers

該字段為可選項,用于列出指令中涉及到的且沒出現在output operands字段及input operands字段的那些寄存器。若寄存器被列入clobber-list,則等于是告訴gcc,這些寄存器可能會被內聯匯編命令改寫。因此,執行內聯匯編的過程中,這些寄存器就不會被gcc分配給其它進程或命令使用。

總結

以上是生活随笔為你收集整理的Linux C中内联汇编的语法格式及使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本a在线观看 | 香蕉av777xxx色综合一区 | 日韩在线播放视频 | www色日本 | 久色网站| 国产精品二区三区 | 久久一线 | 伊人焦久影院 | 亚洲国产欧美另类 | 加勒比av在线播放 | 亚洲free性xxxx护士hd | 无码一区二区精品 | av无限看 | 无码精品在线视频 | 最近中文字幕第一页 | 欧美特级毛片 | 一级做a爰 | 右手影院亚洲欧美 | 亚洲国产高清在线 | 午夜视频观看 | 国内精品久久久久久久影视简单 | 97久久久久久久 | 中文天堂在线视频 | 国产高h视频 | 日日噜噜噜噜久久久精品毛片 | 国产精品久久久久毛片大屁完整版 | 久久噜噜噜精品国产亚洲综合 | 欧美一级爱爱 | 国产黄色美女视频 | 久久人人澡 | 男受被做哭激烈娇喘gv视频 | 欧美毛茸茸| 在线免费观看的av | 日本不卡高字幕在线2019 | 在线免费观看毛片 | 国产中文字幕在线观看 | 人妻丰满熟妇无码区免费 | 中文字幕永久在线播放 | 久久精品国产免费看久久精品 | 黑人一区二区三区四区五区 | 婷婷激情六月 | 国产精品白丝喷水在线观看 | 午夜激情电影在线观看 | 亚洲人人在线 | 潘金莲一级淫片免费放动漫 | 欧美另类videosbestsex | 看a网站 | 在线观看免费黄色 | 精品人伦一区二区三区蜜桃免费 | 精品一区在线 | 日韩黄网 | 成人a站 | 欧美日韩国产一级片 | 色小说综合 | 久久国产网| 中文字幕伦理 | 六月婷婷网 | 香港台湾日本三级大全 | 国产又爽又猛又粗的视频a片 | 三上悠亚久久精品 | 精品交短篇合集 | 成人av资源站 | av一道本 | 日韩国产91 | 光溜溜视频素材大全美女 | 成人在线观看你懂的 | 黄瓜视频在线观看 | 高h大肚孕期孕妇play | 日韩免费一级 | 亚洲精品国产精品乱码不卡 | 手机看片亚洲 | 四虎网站在线播放 | 少妇高潮伦 | 久久精品无码毛片 | 超碰在线超碰 | 国产欧美日韩成人 | xxx69美国| 99re6在线视频| 久久精品国产精品亚洲毛片 | 九月婷婷丁香 | 日本一区视频在线 | 摸一摸操一操 | 国产一区视频免费观看 | 99久久婷婷国产综合精品电影 | 四川丰满少妇被弄到高潮 | 三级av在线播放 | jizz性欧美15| 亚洲欧美另类图片 | 国产剧情自拍 | 亚洲精品一区二区三区婷婷月 | www.一起操| 国产色影院 | 蜜桃精品久久久久久久免费影院 | 中国肥胖女人真人毛片 | 人人免费操 | 成年人午夜网站 | 国产精品久久久久久中文字 | 三年大全国语中文版免费播放 | 91久久久久久久久久 |