C指標原理(8)-C內嵌彙編

dead_lee發表於2021-09-09


#include <stdio.h>

int main(void){

    int xa=6;

    int xb=2;

    int result;

   //使用佔位符,由r表示,編譯器自主選擇使用哪些暫存器,%0,%1。。。表示第1、2。。。個變數

    asm volatile(

    "add %1,%2nt" 

    "movl %2,%0"

     :"=r"(result):"r"(xa),"r"(xb));    

    printf("%dn",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,%0nt" 

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

printf("%dn",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]nt" 

     :[myb]"=r"(xb):[mya]"r"(xa),"0"(xb));    

    printf("%dn",xb);

    return 0;

}

©著作權歸作者所有:來自51CTO部落格作者myhaspl的原創作品,如需轉載,請註明出處,否則將追究法律責任

cc++軟體設計與架構


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4686/viewspace-2819716/,如需轉載,請註明出處,否則將追究法律責任。

相關文章