MIPS 彙編/MIPS 指令
組合語言程式有一些共同的特徵。這些是
- 標籤
- 節
- 指令
- 註釋
- 命令
在 MIPS 彙編中,註釋用 井號 ("#") 表示。井號之後的同一行上的所有內容都是註釋,會被彙編器的詞法分析器跳過。
標籤 是為了讓你的生活更簡單。當你引用你的程式的一部分時,你不需要數行,你只需要給它起一個名字。你可以在迴圈、跳轉和變數名中使用它。
標籤不會出現在你的最終程式碼中,它們只是為了方便,這是你從典型的 MIPS 彙編器得到的少數好處之一。它也讓彙編器的工作變得簡單,因為它現在可以輕鬆地重新定位和連結程式碼。如果你不知道這些是什麼,不用擔心,後面會講到。
MIPS 彙編中的標籤,實際上在大多數 ASM 變體中也是如此,是透過編寫以下內容建立的
name:
其中 name 是你用來引用這個標籤的名稱。注意,你不能用與 MIPS 指令相同的名稱建立標籤。
標籤與它們的 C 表兄弟相同,是 goto 運算子的目標。
節 是一種將組合語言程式邏輯地劃分為指令和資料的方式。由於你的彙編程式被載入到記憶體中,處理器只需要知道執行的開始位置(稱為入口點),然後僅僅增加指令指標,然後繼續執行。如果資料在記憶體中的指令程式碼中交織,處理器需要知道什麼是資料,什麼是指令 - 這對於一個更復雜的處理器來說是很有用的。為了簡單起見,資料被放置在一個與指令不同的區域。節就是為了這個目的而使用的。
在 MIPS 程式設計中,你需要注意兩個節:文字節和資料節。文字節包含你的彙編程式,資料節包含你的資料。用以下方法指定文字節的開始.text以及資料節的開始.data.
處理器彙編器(或你的模擬器)理解一些特殊的命令,這些命令執行特定的任務,使你的生活更輕鬆:例如,為你建立記憶體空間,以便在變數中儲存資料。
如果你想在你的彙編程式中為一個數字建立一個變數,你可能想要
- 切換到資料節
- 建立一個標籤來為你的變數建立一個記憶體引用
- 給它一個合適的名稱
- 為它分配一些記憶體
- 在記憶體中正確地對齊它。
- 切換回文字節
根據我們所學到的知識,我們可以寫出到步驟 3 的 MIPS 彙編程式碼
.data
variable_name:
但是現在我們如何分配一些記憶體呢?我們使用.space指令。通常情況下,一個整數佔用 4 個位元組,所以我們寫
.data
variable_name:
.space 4
我們現在需要在記憶體中對齊 資料(我們將在下面解釋),所以我們使用.align指令
.data
variable_name:
.space 4
.align 2
.text
我們已經切換回了文字節。
MIPS 彙編器中的記憶體位置需要對齊 - 也就是說,記憶體位置必須從正確的位置開始,否則處理器會崩潰。4 位元組整數必須每 4 位元組對齊,依此類推。該.align n指令將資料對齊到適合 2n 位元組的記憶體單元。因此,對於 32 位(4 位元組)整數,我們使用.align 2對於 22 或 4 位元組。將下一個變數或指令對齊到一個位元組上,該位元組是該數字的倍數。為了對齊分配的空間,'align n' 應該在 'space x' 宣告之前。例如,以下是一個在記憶體中分配 6 個字(6 x 4 = 24 位元組)並在字邊界上對齊它們的示例
.data
.align 2
my_var_name:
.space 24