C指针原理(8)-C内嵌汇编
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内嵌汇编的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis session 超时时间_S
- 下一篇: Intellij Idea的使用之svn