C指针原理(8)-C内嵌汇编
result、xa、xb綁定的寄存器由編譯器決定,前面的例子中我們采用直接指定的方式,在這里我們改成由編譯器
自主選擇,"r"是占位符,表示由編譯器自主選擇使用哪些寄存器,不指定哪個(gè)變量綁定在哪個(gè)寄存器上,
:"=r"(result):“r”(xa),“r”(xb)
那我們?nèi)绾沃肋@些變量綁定在哪些寄存器上呢,不知道綁定的寄存器,如何對(duì)變量進(jìn)行操作呢,可以使用
%0,%1這樣的符號(hào)來代替要操作的寄存器,%后的數(shù)字表示第幾個(gè)變量,如:%0,%1。。。表示第1、2。。。個(gè)變量。
:"=r"(result):“r”(xa),“r”(xb)
上面這個(gè)輸出和輸入列表已經(jīng)指定了變量的順序,
result是第0個(gè),xa是第1個(gè),xb是第2個(gè)
下面的例子完成 xb=xb-xa的計(jì)算,問題出現(xiàn)了,可能會(huì)導(dǎo)致xb被分配了2個(gè)寄存器:
:"=r"(xb):“r”(xa),“r”(xb));
使用引用占位符能有效地使用可用寄存器,在這里我們指定xb使用第0個(gè)變量綁定的寄存器
:"=r"(xb):“r”(xa),“0”(xb));
第0個(gè)變量就是xb,即xb綁定的寄存器被修改后,結(jié)果仍寫回原寄存器
下面是完整例子
#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; }我們編譯運(yùn)行一下
$ gcc -o test test.c
$ ./test
4
用數(shù)字來表示變量的順序也許很麻煩,我們可以使用更簡單的方法,使用“[標(biāo)識(shí)]”的格式標(biāo)記綁定后的變量。 下面的代碼完成xb=xb+xa的計(jì)算
#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; }總結(jié)
以上是生活随笔為你收集整理的C指针原理(8)-C内嵌汇编的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis session 超时时间_S
- 下一篇: Intellij Idea的使用之svn