跳轉到內容

MIPS 彙編/MIPS 指令

來自華夏公益教科書,開放的書籍,開放的世界

編寫彙編程式碼

[編輯 | 編輯原始碼]

組合語言程式有一些共同的特徵。這些是

  • 標籤
  • 指令
  • 註釋
  • 命令

在 MIPS 彙編中,註釋用 井號 ("#") 表示。井號之後的同一行上的所有內容都是註釋,會被彙編器的詞法分析器跳過。

標籤 是為了讓你的生活更簡單。當你引用你的程式的一部分時,你不需要數行,你只需要給它起一個名字。你可以在迴圈、跳轉和變數名中使用它。

標籤不會出現在你的最終程式碼中,它們只是為了方便,這是你從典型的 MIPS 彙編器得到的少數好處之一。它也讓彙編器的工作變得簡單,因為它現在可以輕鬆地重新定位和連結程式碼。如果你不知道這些是什麼,不用擔心,後面會講到。

MIPS 彙編中的標籤,實際上在大多數 ASM 變體中也是如此,是透過編寫以下內容建立的

name:

其中 name 是你用來引用這個標籤的名稱。注意,你不能用與 MIPS 指令相同的名稱建立標籤。

標籤與它們的 C 表兄弟相同,是 goto 運算子的目標。

是一種將組合語言程式邏輯地劃分為指令和資料的方式。由於你的彙編程式被載入到記憶體中,處理器只需要知道執行的開始位置(稱為入口點),然後僅僅增加指令指標,然後繼續執行。如果資料在記憶體中的指令程式碼中交織,處理器需要知道什麼是資料,什麼是指令 - 這對於一個更復雜的處理器來說是很有用的。為了簡單起見,資料被放置在一個與指令不同的區域。節就是為了這個目的而使用的。

在 MIPS 程式設計中,你需要注意兩個節:文字節和資料節。文字節包含你的彙編程式,資料節包含你的資料。用以下方法指定文字節的開始.text以及資料節的開始.data.

處理器彙編器(或你的模擬器)理解一些特殊的命令,這些命令執行特定的任務,使你的生活更輕鬆:例如,為你建立記憶體空間,以便在變數中儲存資料。

如果你想在你的彙編程式中為一個數字建立一個變數,你可能想要

  1. 切換到資料節
  2. 建立一個標籤來為你的變數建立一個記憶體引用
  3. 給它一個合適的名稱
  4. 為它分配一些記憶體
  5. 在記憶體中正確地對齊它。
  6. 切換回文字節

根據我們所學到的知識,我們可以寫出到步驟 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


華夏公益教科書