MIPS架構與組合語言快速入門

來源:互聯網
上載者:User

http://blog.tianya.cn/blogger/post_show.asp?BlogID=1915807&PostID=18868775

 

 

MIPS架構與組合語言快速入門
  ━ 譯自伊利諾大學網頁。有內容刪減和增加。 原文連結為: http://logos.cs.uic.edu/366/notes/MIPS%20Quick%20Tutorial.htm
  
  譯者:Clark J Li 李久
  日期:2009/9/5
  1. 資料類型
  1.1. 資料類型

   位元組(Byte)為8 Bits;
   半字(Half-word) 為16 Bits 即2個位元組;
   字 (Word) 為32 Bits 即4個位元組;
   一個字元需要一個Byte的空間;
   一個整數需要1個Word(4 Byte)的空間;

  1.2. 指令長度
   所有的指令都是32 Bits 的長度;

  2. 寄存器
   MIPS體系架構有32個通用寄存器。在組譯工具中,可以用編號 $0 到 $31來表示;
   也可以用寄存器的名字來進行表示, 例如: $sp, $t1, $ra….
   有兩個特殊的寄存器 Lo, Hi, 用來儲存乘法/除法的運算結果;
   堆棧(Stack)的增長方向是: 從記憶體的高地址方向, 向低地址方向;
  
  寄存器編號
  Register Number 寄存器名稱
  Register Alternative Name 寄存器描述
  Description

  0 Zero 第0號寄存器,其值始終為0
  1 $at (Assembler Temporary) 是Assembler保留的寄存器
  2 ~ 3 $v0 ~ $v1 儲存運算式或函數返回的結果
  4 ~ 7 $a0 ~ $a3 作為函數的前四個入參。在函數調用的過程中不會被儲存。
  8 ~ 15 $t0 ~ $t7 供組譯工具使用的臨時寄存器。
   其值在函數調用的過程中不會被儲存。
  16 ~ 23 $s0 ~ $s7 子函數在使用這類寄存器時, 必須保其初始值, 在子函數退出前, 必須恢複其原來的初始值. 其值在函數調用的過程中會被儲存。
  24 ~ 25 $t8 ~ $t9 與$t0 ~ $t7的用法相同.
  26 ~ 27 $k0 ~ $k1 僅供中斷(interrupt/trap)處理函數使用.
  28 $gp 全域指標.
  29 $sp 堆棧指標, 指向堆棧的棧頂。
  30 $s8/$fp 儲存的值/幀指標。
  其值在函數調用的過程中會被儲存。
  31 $ra 返回地址
  
  3. 程式結構
  彙編來源程式代碼本質上是文字檔。由資料聲明、程式碼片段 兩部分組成。

  3.1. 資料聲明
  在原始碼中,資料聲明部分以 .data開始。聲明了在代碼中使用的變數的名字。同時,也在RAM中建立了對應的空間。
  
  資料聲明的格式:
   Name: storage_type value(s)
  舉例:
   Var1: .word 3 # 建立了一個佔1 Word空間的變數, 並賦初值3
  
  3.2. 程式碼片段
  在原始碼中,以 .text開始。列出了彙編代碼。 各個不同功能的程式碼片段,用標籤來標識。
  
  3.3. MIPS 組譯工具例子
  Example:
   .data # data declaration
  var1: .word 23 # declare storage for var1; initial value is 23
  
   .text # Code section
  __start: # __start is a lable
   lw $t0, var1 # load contents of RAM location into register # it means $t0 = var1
  
   li $t1, 5 # $t1 = 5 ("load immediate")
   sw $t1, var1 # store contents of register $t1 into RAM
   # it means var1 = $t1
   done
  
  4. 彙編指令
  4.1. Load/Store指令
   RAM訪問相關
  關於RAM的訪問只能使用Load/Store指令。
  
  分類 指令格式 注釋
  Load li register_destination, value 立即數載入。 把value 載入到目標寄存器
   lw register_destination, RAM_source 從RAM源地址處 複製一個Word(4 Bytes)到目標寄存器
   lb register_destination, RAM_source 從RAM源地址處 複製一個Byte到目標寄存器的低端處
  Store sw register_source, RAM_ destination 把源寄存器中的值(4 Bytes)儲存到RAM目的地址中
   sb register_source, RAM_ destination 把源寄存器的低端1個Byte, 儲存到RAM目的地址中
  
   定址相關指令
  
  分類 指令格式與執行個體 注釋
  Load la $t0, val_1 複製val_1表示的地址到t0寄存器中
  註: val_1是個Label
   lw $t2, ($t0) t0寄存器中的值作為地址,把這個地址起始的Word 複製到t2 中
   lw $t2, 4($t0) t0寄存器中的值作為地址, 把這個地址再加上位移量4後 所起始的Word 複製到t2 中
  Store sw $t2, ($t0) 把t2寄存器中值(1 Word),儲存到t0的值所指向的RAM中
   sw $t2, -12($t0) 把t2寄存器中值(1 Word),儲存到t0的值再減去位移量12, 所指向的RAM 中
  
  4.2. 算數運算指令
   算數運算指令的所有運算元都是寄存器,不能直接使用RAM地址或間接定址。
   運算元的大小都為 Word (4-Byte)
  指令格式與執行個體 注釋
  move $t5, $t1 $t5 = $t1;
  add $t0, $t1, $t2 $t0 = $t1 + $t2; 帶符號數相加
  sub $t0, $t1, $t2 $t0 = $t1 - $t2; 帶符號數相減
  addi $t0, $t1, 5 $t0 = $t1 + 5;
  addu $t0, $t1, $t2 $t0 = $t1 + $t2; 無符號數相加
  subu $t0, $t1, $t2 $t0 = $t1 - $t2; 無符號數相減
  mult $t3, $t4 $t3 乘以 $t4, 把64-Bits 的積,儲存到Lo,Hi中。
  即: (Hi, Lo) = $t3 * $t4;
  div $t5, $t6 Lo = $t5 / $t6 (Lo為商的整數部分)
  Hi = $t5 mod $t6 (Hi為餘數)
  mfhi $t0 $t0 = Hi
  mflo $t1 $t1 = Lo
  
  4.3. 分支跳轉指令
   分支指令
  指令格式與執行個體 注釋
  b target 無條件的分支跳轉,將跳轉到target 標籤處
  beq $t0, $t1, target 如果 $t0 == $t1, 則跳轉到target 標籤處
  blt $t0, $t1, target 如果 $t0 < $t1, 則跳轉到target 標籤處
  ble $t0, $t1, target 如果 $t0 <=$t1, 則跳轉到target 標籤處
  bgt $t0, $t1, target 如果 $t0 > $t1, 則跳轉到target 標籤處
  bge $t0, $t1, target 如果 $t0 >= $t1, 則跳轉到target 標籤處
  bne $t0, $t1, target 如果 $t0 != $t1, 則跳轉到target 標籤處
  
   跳轉指令
  指令格式與執行個體 注釋
  j target 無條件的跳轉, 將跳轉到target 標籤處
  jr $t3 跳轉到t3寄存器所指向的地址處(Jump Register)
  
  4.4. 子函數調用指令
  指令格式與執行個體 注釋
  jal sub_routine_label 執行步驟:
  1. 複製當前的PC(Program Counter)到$ra寄存器中。 因為當前的PC 值就是子函數執行完畢後的返回地址。
  2. 程式跳轉到子程式標籤sub_routine_label處。
  
  註:子函數的返回,使用 jr $ra
  
  如果子函數內又調用了其他的子函數,那麼$ra的值應該被儲存到堆棧中。 因為$ra的值總是對應著當前執行的子函數的返回地址。
【天涯部落格】本文地址http://blog.tianya.cn/blogger/post_show.asp?BlogID=1915807&PostID=18868775

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.