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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

C指针原理(8)-C内嵌汇编

發布時間:2025/3/12 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C指针原理(8)-C内嵌汇编 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <stdio.h> int main(void){int xa=6;int xb=2;int result;//使用占位符,由r表示,編譯器自主選擇使用哪些寄存器,%0,%1。。。表示第1、2。。。個變量asm volatile("add %1,%2\n\t" "movl %2,%0":"=r"(result):"r"(xa),"r"(xb)); printf("%d\n",result);return 0; }

result、xa、xb綁定的寄存器由編譯器決定,前面的例子中我們采用直接指定的方式,在這里我們改成由編譯器

自主選擇,"r"是占位符,表示由編譯器自主選擇使用哪些寄存器,不指定哪個變量綁定在哪個寄存器上,

:"=r"(result):“r”(xa),“r”(xb)

那我們如何知道這些變量綁定在哪些寄存器上呢,不知道綁定的寄存器,如何對變量進行操作呢,可以使用

%0,%1這樣的符號來代替要操作的寄存器,%后的數字表示第幾個變量,如:%0,%1。。。表示第1、2。。。個變量。

:"=r"(result):“r”(xa),“r”(xb)

上面這個輸出和輸入列表已經指定了變量的順序,

result是第0個,xa是第1個,xb是第2個

下面的例子完成 xb=xb-xa的計算,問題出現了,可能會導致xb被分配了2個寄存器:

:"=r"(xb):“r”(xa),“r”(xb));

使用引用占位符能有效地使用可用寄存器,在這里我們指定xb使用第0個變量綁定的寄存器

:"=r"(xb):“r”(xa),“0”(xb));

第0個變量就是xb,即xb綁定的寄存器被修改后,結果仍寫回原寄存器

下面是完整例子

#include <stdio.h> int main(void){ int xa=2; int xb=6; asm volatile( "subl %1,%0\n\t" :"=r"(xb):"r"(xa),"0"(xb)); printf("%d\n",xb); return 0; }

我們編譯運行一下

$ gcc -o test test.c
$ ./test

4

用數字來表示變量的順序也許很麻煩,我們可以使用更簡單的方法,使用“[標識]”的格式標記綁定后的變量。 下面的代碼完成xb=xb+xa的計算

#include <stdio.h> int main(void){int xa=6;int xb=2;asm volatile("add %[mya],%[myb]\n\t" :[myb]"=r"(xb):[mya]"r"(xa),"0"(xb)); printf("%d\n",xb);return 0; }

總結

以上是生活随笔為你收集整理的C指针原理(8)-C内嵌汇编的全部內容,希望文章能夠幫你解決所遇到的問題。

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