riscv下的GCC內聯彙編

2021-10-10 12:46:16 字數 1556 閱讀 7143

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...