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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅析gcc内嵌汇编

發布時間:2024/9/5 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析gcc内嵌汇编 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Linux代碼中很多地方都使用了這種形式的匯編語言,嵌入匯編程序的格式如下:
__asm__ __volatile__ (
asm statements
: outputs
: inputs
: registers-modified
);
asm statements是一組AT&T格式的匯編語言語句,每個語句一行,由\n分隔各行。所有的語句都被包裹在一對雙引號內。其中使用的寄存器前面要加兩個%%做前綴;轉移指令多是局部轉移,因此多使用數字標號。
inputs指明程序的輸入參數,每個輸入參數都括在一對圓括號內,各參數用逗號分開。每個參數前加一個用雙引號括起來的標志,告訴編譯器把該參數裝入到何處。
可用的標志有:
“g”:讓編譯器決定如何裝入它;
“a”:裝入到ax/eax;
“b”:裝入到bx/ebx;
“c”:裝入到cx/ecx;
“d”:裝入到dx/edx;
“D”:裝入到di/edi;
“S”:裝入到si/esi;
“q”:a、b、c、d寄存器等;
“r”:任一通用寄存器;
“i”:整立即數;
“I”:0-31 之間的立即數(用于32位移位指令);
“J”:0-63 之間的立即數(用于64 位移位指令);
“N”:0-255 ,之間的立即數(用于out 指令);
“n”:立即數,有些系統不支持除字以外的立即數,這些系統應該使用“n”而不是“i”;
“p”:有效內存地址;
“m”:內存變量;
“o”:操作數為內存變量,但是其尋址方式是偏移量類型,也即是基址尋址,或者是基址加變址尋址;
“V”:操作數為內存變量,但尋址方式不是偏移量類型;
“,”:操作數為內存變量,但尋址方式為自動增量;
“X”:操作數可以是任何類型;
“f”:浮點數;
“t”:第一個浮點寄存器;
“u”:第二個浮點寄存器;
“G”:標準的80387;
??% :浮點常數,該操作數可以和下一個操作數交換位置;
“=”:輸出;
“+”:既是輸入又是輸出;
“&”:改變其值之前寫,分配一個獨立的寄存器,使得函數返回值和該變量不因為重復使用同一個寄存器,出現數據覆蓋;
“%”:與下一個操作數之間可互換;
“#”:忽略其后的字符,直到逗號;
“*”:當優先選擇寄存器時,忽略下面的字符;
“0”~“9”:指定一個操作數,它既做輸入又做輸出。通常用“g”;
outputs指明程序的輸出位置,通常是變量。每個輸出變量都括在一對圓括號內,各個輸出變量間用逗號隔開。每個輸出變量前加一個標志,告訴編譯器從何處輸出。
可用的標志與輸入參數用的標志相同,只是前面加“=”。如“=g”。輸出操作數必須是左值,而且必須是只寫的。如果一個操作數即做輸出又做輸入,那么必須將它們分開:一個只寫操作數,一個輸入操作數。輸入操作數前加一個數字限制(0~9),指出輸出操作數的序號,告訴編譯器它們必須在同一個物理位置。兩個操作數可以是同一個表達式,也可以是不同的表達式。
registers-modified告訴編譯器程序中將要修改的寄存器。每個寄存器都用雙引號括起來,并用逗號隔開。如“ax”。如果匯編程序中引用了某個特定的硬件寄存器,就應該在此處列出這些寄存器,以告訴編譯器這些寄存器的值被改變了。如果匯編程序中用某種不可預測的方式修改了內存,應該在此處加上“memory”。這樣以來,在整個匯編程序中,編譯器就不會把它的值緩存在寄存器中了。
如:
“cc”:你使用的指令會改變CPU的條件寄存器cc;
“memory”:你使用的指令會修改內存;?

__volatile__是可選的,它防止編譯器修改該段匯編語句(重排序、重組、刪除等)。
輸入參數和輸出變量按順序編號,先輸出后輸入,編號從0開始。程序中用編號代表輸入參數和輸出變量(加%做前綴)。
輸入、輸出、寄存器部分都可有可無。如有,順序不能變;如無,應保留“:”,除非不引起二意性。
看一個在C語言中使用at&t的嵌入匯編程序的例子,c語言中的3個int變量,一般會是三個內存地址。每個操作數的長度則要根據操作系統和編譯器來決定,一般32位操作系統為32位,則每個操作數占用4個字節:
int i=0, j=1, k=0;
__asm__ __volatile__("
??pushl %%eax\n? ?? ?? ?? ?? ?//asm statement
??movl %1, %%eax\n? ?? ?? ?? ?//asm statement
??addl %2, %%eax\n? ?? ?? ?? ?//asm statement
??movl %%eax, %0\n? ?? ?? ?? ?//...
??popl %%eax"? ?? ?? ?? ?? ???//...
: "=g" (k)? ?? ?? ?? ?? ?? ? //outputs? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
: "g" (i), "g" (j)? ?? ?? ???//inputs
: "ax", "memory"? ?? ?? ?? ? //registers modified
);? ??
按照參數編號原則輸出參數參數k為%0,輸入參數i和j依次為%1和%2。值得注意的是輸出和輸入標志都使用了"g",所以我們不必關心這些參數究竟是使用了寄存器還是內存操作數,編譯器自己會決定。?

本文來自ChinaUnix博客,如果查看原文請點: http://blog.chinaunix.net/u1/38994/showart_333001.html

總結

以上是生活随笔為你收集整理的浅析gcc内嵌汇编的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲熟区 | 国产视频一二三 | 2021av| 亚洲黄色一级 | 久久yy | 成人一级大片 | 香港三级在线视频 | 黄色成人在线观看 | 国产精品国产三级国产aⅴ9色 | 琪琪成人 | 日韩在线精品视频 | 日韩免费影院 | 夏目彩春娇喘呻吟高潮迭起 | 亚洲性一区 | 这里精品| 好吊色网站 | 91丨porny在线 | 精品动漫一区二区三区在线观看 | 国产精品久久国产愉拍 | 3d动漫啪啪精品一区二区中文字幕 | 亚洲欧美在线播放 | 国产伦精品视频一区二区三区 | 女性爱爱视频 | www.一区| 久久午夜精品视频 | 噼里啪啦国语版在线观看 | 综合激情网五月 | 日韩欧美高清在线视频 | 国产精品一二三四五 | 欧美成人午夜精品久久久 | 浪荡奴双性跪着伺候 | 国产一区一区 | 婷婷五月精品中文字幕 | 国产伦精品一区二区三区视频网站 | 久久久精品免费视频 | 奇米影视777四色 | 亚洲视频欧洲视频 | 精品国产av色一区二区深夜久久 | 肥熟女一区二区三肥熟女 | 激情都市一区二区 | 国产91精品露脸国语对白 | 啪啪av网站 | 免费视频中文字幕 | 中文字幕一区二区三区免费看 | 欧美三日本三级少妇三99 | 偷拍精品一区二区三区 | 日本一区二区免费高清视频 | 国产三级按摩推拿按摩 | 偷拍第1页 | 精品熟妇视频一区二区三区 | tube国产麻豆| 99国产精品99久久久久久粉嫩 | av无限看 | 神秘马戏团在线观看免费高清中文 | av福利在线看 | 色视频在线免费观看 | 无码国精品一区二区免费蜜桃 | 日韩插| www.成人精品 | 欧美日韩中文字幕在线 | 天天操天天爽天天射 | 双性懵懂美人被强制调教 | 欧洲精品久久久久毛片完整版 | 一区视频| 国产伦理一区二区三区 | 欧美精品一区二区三区在线播放 | 国产黄色美女视频 | 亚洲永久免费网站 | 激情小说在线观看 | 岛国av电影在线观看 | 97超碰资源站| 九色视频自拍 | 日产av在线播放 | 久久男人视频 | 在线不卡日韩 | 男生和女生一起差差差很痛的视频 | 亚洲风情亚aⅴ在线发布 | 老司机在线免费视频 | 亚洲成人av免费在线观看 | 亚洲免费av电影 | 黄色网日本 | 爽爽爽av| 精品一区李梓熙捆绑 | 久久av一区二区三区亚洲 | 国产成人三级在线观看视频 | 国产成人精品在线播放 | 免费观看毛片网站 | xxxxx黄色片 噜噜噜噜噜色 | 91精品中文字幕 | a天堂中文在线 | 国产福利在线免费观看 | 亚洲专区一区 | 大肉大捧一进一出好爽动态图 | 成人性生交大片免费看96 | 狠狠撸视频 | 中国极品少妇xxxxx | 日韩精品免费看 | 成人午夜久久 | 琪琪久久 |