第二十五期 openEuler組合語言(1)

2021-10-05 05:04:53 字數 2173 閱讀 2189

上兩期中我們介紹了armv8-a的快取一致性特性,在這兩期中我們介紹openeuler系統中的組合語言。為了更好地學習這些組合語言,我們先來了解一下arm體系結構相關的組合語言的使用。

在之前的**中我們介紹了armv8-a架構的指令集和暫存器。指令集就如同高階程式語言中的語句,暫存器就如同語句中的變數。然而只了解語句也無法編寫出完整的程式,我們還需要了解語句的組織形式。就像在高階語言中一樣,arm組合語言也可以有條件判斷、分支、迴圈和函式等組織形式。想要了解常用彙編指令助記符的含義,可以檢視第15期《arm體系結構基礎(1)》。

下圖展示了乙個arm組合語言中使用條件判斷的例子[1]:

在這段**中,r0暫存器首先儲存了立即數2,然後cmp指令將r0中儲存的值與立即數3進行比較。由於r0中的值小於立即數3,因此cpsr暫存器中的n位被置為1。接著addlt指令被執行,因為條件碼lt所需的條件(v!=n,v為cpsr中的溢位位)滿足了。暫存器r0中的值自加一從而變成3。這樣在第二次執行cmp指令時n位就變成0,所以第二個addlt指令就不會執行。上面這段**實現了程式設計中常見的if判斷。

一般程式設計中還可以使用分支(branch)的結構,下面這段arm組合語言展示了乙個分支的例子[1]:

在這個例子中,程式首先比較暫存器r1和暫存器r2中的值,如果r1中的值小於r2中的值,那麼跳轉到r1_lower程式段,否則執行blt指令下面的mov指令。

借助分支跳轉指令還可以完成迴圈功能,下圖展示了乙個用彙編**實現迴圈的例子[1]:

在迴圈的開始程式將r0中的值和立即數4比較,如果r0中的值與4相等則跳轉到end程式段,否則將r0中的值自加一併繼續迴圈,因為r0中的初始值為0因此迴圈要執行5次,最後一次跳轉到end程式段。

函式是高階語言程式設計時常用的語句組織形式,用arm組合語言也可以實現函式式程式設計,下圖展示了乙個這樣的例子[2]:

在這個例子中main函式可以被分為三個部分:

下圖[2]為main函式的前段,在這段**中暫存器r11裡面儲存著函式棧的位址。前段首先通過push指令儲存棧指標和暫存器lr,然後通過add指令將棧底的位址存入暫存器r11中,最後用sub指令為棧分配空間。

main函式的中段主要呼叫了max函式,max函式比較了暫存器r0和暫存器r1中值的大小,且如果暫存器r0中的值小於暫存器r1中的值,那麼將r1中的值儲存到r0中。函式max的引數是通過暫存器傳遞的,若引數過多也可以用棧傳遞。下圖顯示了main函式的主體[2]:

main函式的末段恢復了將儲存在r11的棧指標恢復到了sp暫存器中,並將在函式開頭儲存的r11值恢復。在函式開頭儲存的lr暫存器中的內容則被恢復到pc暫存器中,從而通過該位址返回了呼叫main函式的地方。下圖展示了main函式的後段[2]:

max函式也可分為前段、主體和後段,其中前段和後段的功能與main函式是類似的。不同的是max函式的前段沒有儲存lr暫存器,這是因為main函式需要呼叫其他函式,lr暫存器中的內容可能改變而max函式不需要呼叫其他函式。我們可以注意到main函式呼叫max函式時使用了bl指令,這個指令會將bl指令下一條指令的位址存入lr暫存器,用於呼叫返回。max函式返回main函式時使用了bx指令,這條指令可以在arm模式和thumb模式間進行切換,從而實現不同指令模式的函式進行互相呼叫。

本期我們介紹了一些arm組合語言的程式設計方法,下一期中我們分析一下arm內嵌彙編器。

參考文獻

[1]

[2]

第二十五天

程序 資源分配的最小單元 程序的組成 程式 資料和程序控制塊 pcb 所有的排程都是提前準備的 程序的經典三態 執行 就緒 等待 父程序的id ppid 啟動程序的使用者id uid 排程演算法 1.先來先服務 2.短程序優先 3.高優先順序優先 4.時間片輪轉法 一般都是用這個 先來先服務演算法的...

第二十五天

學會了final的相關使用方法 明天學習abstract關鍵字 一 final關鍵字 final關鍵字是最終的意思,使用final修飾類,代表該類不能被繼承。final修飾方法表示該方法不能被重寫。final修飾變數,代表該變數是常量 1 final方法 使用final修飾方法時,該方法不能被重寫,...

安卓自測試題 第二十五期

第二十四期試題答案 1 a 2 b3 c 4 d5 d 6 c7 b 8 答 andriod 提供了 handler 和 looper 來滿足執行緒間的通訊。handler 先進先出原則。looper 類用來管理特定執行緒內物件之間的訊息交換 message exchange 1 looper 乙個...