asm volatile(
彙編指令列表
∶輸出運算元 //非必需
∶輸入運算元 //非必需
∶可能影響的暫存器或儲存器 1/非必需
);
learn from example
__asm__ __volatile__
("instruction_l;\
instruction 2;\
...\
instruction_n;"
:[out1]
"=r"
(valuel)
,[out2]
"=r"
(value2),.
..[outn]
"=r"
(valuen)
:[inl]
"r"(valuel)
,[in2]
"r"(value2),.
..[inn]
"r"(valuen)
:"r0"
,"r1",.
.."rn"
);
gcc 內聯彙編語法的"輸入運算元"和"輸出運算元"部分用來指定當前內聯匯程式設計序的輸入和輸出操作符列表
常用的constraints有以下幾個:
輸出操作符之間需使用逗號分隔。
如果內聯彙編中的某個指令會更新某些暫存器的值,則必須在 asm中第三個冒號後的"可能影響的暫存器或儲存器"中地指定出這些暫存器,通知gcc編譯器不再假定之前存入這些暫存器中的值依然合法。
int sum;
int add1=
100;
int add2=
200;
//插入彙編**呼叫add彙編指令進行加法操作
__asm__ __volatile__
("add %[dest], %[srcl], %[src2]"
//使用add指令,乙個目標運算元(命名為dest),
//兩個源運算元(分別命名為sre1和src2)
:[dest]
"=r"
(sum)
//將add指令的目標運算元dest和c程式中的sum變數繫結。
:[srcl]
"r"(add1)
,[src2]
"r"(add2)
//將add指令的源運算元srec1和c程式中的add1變數繫結
//將源運算元 arc2和add2變數繫結
//此內聯彙編沒有指定可能影響的暫存器或儲存器,因此省略第三個冒號
);
**二進位制介面(abstract binary inte***ce,abi):**abi描述了應用程式和作業系統之間、應用和它的庫之間,以及應用的組成部分之間的介面
對於risc-v匯程式設計序而言,在匯程式設計序中呼叫c/c+語言函式,必須遵照abi所定義的函式呼叫規則,即函式引數由暫存器a0 ~a7傳遞,函式返回由暫存器a0~a1指定.
GCC內聯彙編
有時為了高效,有時為了直接控制硬體,有些模組我們不得不直接用組合語言來編寫,並且對外提供呼叫的介面,隱藏細節,這其實就是內聯彙編。如何使用內聯彙編?我們就以 gcc 為例,一窺其中奧秘!一 關鍵字 如何讓 gcc 知道 中內嵌的彙編呢?借助 關鍵字!來看下面的例子 asm volatile hlt ...
gcc內聯彙編
有時為了高效,有時為了直接控制硬體,有些模組我們不得不直接用組合語言來編寫,並且對外提供呼叫的介面,隱藏細節,這其實就是內聯彙編。如何使用內聯彙編?我們就以 gcc 為例,一窺其中奧秘!一 關鍵字 如何讓 gcc 知道 中內嵌的彙編呢?借助關鍵字!來看下面的例子 a volatile hlt a 表...
GCC 內聯彙編
有時為了高效,有時為了直接控制硬體,有些模組我們不得不直接用組合語言來編寫,並且對外提供呼叫的介面,隱藏細節,這其實就是內聯彙編。如何使用內聯彙編?我們就以 gcc 為例,一窺其中奧秘!一 關鍵字 如何讓 gcc 知道 中內嵌的彙編呢?借助關鍵字!來看下面的例子 asm volatile hlt a...