日韩性视频-久久久蜜桃-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中内联汇编的语法格式及使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 中日韩免费视频 | 国产乱码精品一区二区三区不卡 | 久久一区欧美 | 国产经典久久久 | 国产精品日韩电影 | 欧美狠狠爱 | 日韩欧美在线视频播放 | 国产97超碰| 91中文字幕网 | 国产精品欧美激情 | 性色生活片 | 中文字幕精品三区 | 日本美女在线 | 在线免费观看黄色 | 黑人一级片 | 国产成年人视频 | 国产无码精品在线播放 | 免费看黄色a级片 | 性欧美jzjz2| 亚洲综合在 | 在线免费黄| 亚洲视频一区二区三区四区 | 中文字幕1区2区 | 天天爽夜夜爽夜夜爽 | 亚洲免费三区 | 婷婷综合久久 | 国产精品亲子伦对白 | 国产精品老熟女视频一区二区 | 日日日插插插 | 久草视频福利在线 | 飘花影院伦理片 | 亚洲色图欧美另类 | 老司机激情视频 | 欧美成人性生活 | 国产综合区 | 日韩一级片网址 | 婷婷激情四射 | 日韩一卡二卡三卡四卡 | 亚洲av无码一区二区三区人 | 国产一区二区精彩视频 | 91国内精品视频 | 色一涩| 三级黄色网络 | 91最新地址永久入口 | 葵司ssni-879在线播放 | 亚洲系列在线 | 欧美日韩在线不卡 | 国产精品色综合 | 黄色一级片久久 | 超污网站在线观看 | 视频在线观看视频 | 亚洲AV综合色区无码国产播放 | 国模一区二区三区 | 在线免费看a| 欧美日韩亚洲国产精品 | 人操人爽 | 特a级黄色片 | 激情久久久 | jizz日本少妇 | 日韩一区二区三区四区五区六区 | 欧洲成人在线视频 | 秋霞成人网 | 四川操bbb| 中国黄色在线视频 | 黄色在线网 | 久热亚洲 | 黄色资源在线观看 | 美女久久久 | 成人福利片 | 武侠古典av | 欧美日日操 | 日本一区二区免费看 | www.白浆| 99av视频 | 一区精品在线观看 | 欧美中文字幕一区 | 亚洲精品欧洲精品 | 黄色av导航 | 一区二区三区欧美视频 | 久久成人a毛片免费观看网站 | 妇女一级片 | 日本久久综合 | 日韩精品在线免费观看 | 疯狂少妇 | 荒岛淫众女h文小说 | 久久精品视频1 | 日本欧美视频 | 人人草人人爱 | 人人艹在线 | 国产一级淫片a视频免费观看 | 操丰满女人 | 激情爱爱网站 | 久久不卡区| 91老师国产黑色丝袜在线 | 欧美美女性视频 | 另类视频在线观看+1080p | 五月深爱网 | 四虎黄色片 | 神马久久av |