天天看點

轉載:GCC inline asm

在使用進階語言編寫程式的時候,可以根據需要插入彙程式設計式,無須另外建立彙編檔案。

在編寫inline asm程式時,需要使用​

​asm​

​關鍵字,并将彙程式設計式用括号括起來,以分号結尾。格式如下:

asm(code : output operand list : input operand list : clobber list);      

如果最右側的部分為空,可以聯通相鄰的冒号一起省略。最簡單的形式是隻有指令部分,如:

asm("mov r0,r0");      

複雜的形式則需要提供參數清單,GCC支援兩種方式标注彙編指令參數,老的方式是使用數字,如%0便是第0個操作數,%1表示第一個操作數,以此類推;新的方式支援變量名,如%[result]或者$[value],這個名字和進階語言裡面的變量沒有任何關系。例子如下:

asm("vmsr fpscr,%[value]" : : [value] "r" (var));      

或者

asm("vmsr fpscr, %0" : : "r" (var));      

​VMSR​

​​是ARM的一條VFP指令,上述彙編指令的意圖是将變量​

​var​

​​的值儲存到​

​FPSCR​

​狀态寄存器裡面。由于改指令沒有輸出操作數,是以輸出操作數部分為空,但是相應的冒号要保留。下面的例子則隻有輸出操作數,沒有輸入操作數和clobber list,在這種情況下,相應的冒号也可以省略。

asm("vmrs %[result], fpscr" : "=r" (var));      
asm("vmrs %0, fpscr" : "=r" (var));      

​VMRS​

​​指令将狀态寄存器​

​FPSCR​

​​的值儲存到變量​

​var​

​​裡。注意輸出操作數要使用”​

​=​

​“。

繼續閱讀