暫存器以及嵌入式彙編語法及使用

2021-09-01 13:02:36 字數 1599 閱讀 9878

一、嵌入式彙編語法:

1、格式

1        asm("彙編語句"    //"("之前用asm 或 __asm__   意為"()"的內容是彙編語句

2 :輸出暫存器   

3 :輸入暫存器

4 :會被修改的暫存器);

除第一行以外,後面帶冒號的行若不使用就都可一省略。

輸入暫存器:表示在開始執行彙編**時,這裡指定的一些暫存器中應存放的輸入值,它們也分別對應著一c變數或常數值;

2、例項

1 #define   get_seg_byte(seg,addr)  \

2 ( )

這段**定義了乙個嵌入式組合語言函式。通常使用組合語言最方便的方法是把他們放在乙個巨集內。用圓括號括住的組合語句(花括號中的語句)「({})」可以作為表示式使用,其中最後一行的變數_res是該表示式的輸出值。因為巨集語句需要定義在一行上,因此這裡使用反斜槓「\」將這些語句連成一行。這條紅第一將被替換到程式中引用改巨集名稱的地方。第一行定義了巨集的名稱,即巨集函式名稱get_seg_byte(seg,addr)。第三行定義了乙個暫存器變數_res。該變數將被儲存在乙個暫存器中,以便快速訪問和操作。如果想指定暫存器(如eax),那麼我們可以把改句寫成"register char _res asm("ax");",其中asm也可以寫成_asm_。第四行上的_asm_表示嵌入式彙編語句的開始。第4-7行的4條語句是at&t格式的彙編語句。另外,為了讓gcc編譯產生的組合語言程式中暫存器名稱前有乙個百分號「%」,在嵌入彙編語句暫存器名稱前就必須寫上兩個百分號「%%」。

第8行即輸出暫存器,該語句的含義是在這段**執行結束後將eax所代表的的暫存器的值放入_res變數中,作為本函式的輸出值,「=a」中的「a」稱為載入**,「=」表示這是輸出暫存器,並且其中的值將被輸出值替代。載入**是cpu暫存器,記憶體位址以及一些數值的簡寫字母代號。第9行表示在這段**開始執行時將seg放到eax暫存器中,「0」表示使用與上面相同位置上的輸出暫存器。而((*addr))表示乙個記憶體偏移位址值。為了在上面彙編語句中使用該位址值,嵌入式匯程式設計序規定把輸出和輸入暫存器按統一順序編號,順序是從輸出暫存器序列從左到右從上到下以「%0」開始,分別記為%0、%1···%9.因此,輸出暫存器的編號是%0(這裡只有乙個輸出暫存器),輸入暫存器前一部分(「0」(seg))的編號是%1,而後部分的編號是%2。上面第6行上的%2即代表(*(addr))這個記憶體偏移量。

3、輸入輸出暫存器格式說明

「0」表示使用與上面相同位置上的輸出暫存器

4、特別說明

使用intel cpu時, 當需要進行函式呼叫時,有以下原則:一、eax 、edx、ecx的內容必須由呼叫者自行儲存;二、ebx、esi、edi得內容必須由被調函式保護,當被調這要使用這些暫存器中的任何乙個時,要實現在自己的棧中儲存其內容,因為呼叫者不負責管理;函式操作結束後再還原回去;另外ebp、esp的使用也要遵循第二原則。

彙編常見暫存器以及標誌位

簡寫 英文全稱 中文作用 axaccumulator 累加器存放運算元,與外部裝置 bxbase 通用暫存器 基址暫存器 計算儲存器位址時用 cxcount 通用暫存器 儲存計數值 移位指令,迴圈指令,串處理指令中用作隱含的計數器 dxdata 通用暫存器 雙字長運算時存放高位字或存放i o埠位址 ...

嵌入式系統 儲存器對映與暫存器對映原理

圖1 儲存器對映 儲存器在產家製作完成後是一片沒有任何資訊的物理儲存器,而cpu要進行訪存就涉及到記憶體位址的概念,因此儲存器對映就是為物理記憶體按一定編碼規則分配位址的行為。值得注意,儲存器對映一般是由產家規定,使用者不能隨意更改。圖2 stm32晶元儲存器對映 注1stm32中,i code b...

彙編基礎之暫存器及彙編指令

最近在學習協程方面的知識,在協程的一種實現方式中有一種是用彙編實現的,所以這裡再把彙編知識複習一下。暫存器按照其用途可分為以下4類 資料暫存器包括 個16位的暫存器 ax,bx,cx,dx 或者8個8位的暫存器 ah,al,bh,bl,ch,cl,dh,dl 這些暫存器都是用來暫時存放運算元,運算結...