mips的32個暫存器
Registers also have symbolic names reflecting their conventional8 use:
$0 $zero constant 0
$1 $at used by assembler
$2 $v0 function result
$3 $v1 function result
$4 $a0 argument 1
$5 $a1 argument 2
$6 $a2 argument 3
$7 $a3 argument 4
$8 $t0 unsaved temporary
$9 $t1 unsaved temporary
$10 $t2 unsaved temporary
$11 $t3 unsaved temporary
$12 $t4 unsaved temporary
$13 $t5 unsaved temporary
$14 $t6 unsaved temporary
$15 $t7 unsaved temporary
$16 $s0 saved temporary
$17 $s1 saved temporary
$18 $s2 saved temporary
$19 $s3 saved temporary
$20 $s4 saved temporary
$21 $s5 saved temporary
$22 $s6 saved temporary
$23 $s7 saved temporary
$24 $t8 unsaved temporary
$25 $t9 unsaved temporary
$26 $k0 reserved for EXCEPTION
$27 $k1 reserved for EXCEPTION
$28 $gp pointer to global data
$29 $sp stack pointer
$30 $fp frame pointer
$31 $ra return address
暫存器號 符號名 用途
0 始終為0 看起來象浪費,其實很有用
1 at 保留給彙編器使用
2-3 v0,v1 函式返回值
4-7 a0-a3 前頭幾個函式引數
8-15 t0-t7 臨時暫存器,子過程可以不儲存就使用
24-25 t8,t9 同上
16-23 s0-s7 暫存器變數,子過程要使用它必須先儲存
然後在退出前恢復以保留呼叫者需要的值
26,27 k0,k1 保留給異常處理函式使用
28 gp global pointer;用於方便存取全域性或者靜態變數
29 sp stack pointer
30 s8/fp 第9個暫存器變數;子過程可以用它做frame pointer
31 ra 返回地址
硬體上這些暫存器並沒有區別(除了0號),區分的目的是為了不同的編譯器產生的程式碼可以通用
=========================================
lui 中i表示載入常數
li r, c:載入16bit或32bit常數到r
lui r, c:載入16bit常數到r的高16位load constant halfword c into upper halfword of register r
(translation of pseudo instructions)
偽指令 翻譯的實際指令
not r, s ==> nor r, s, $0
move r, s ==> or r, s, $0
li r, c ==> ori r, $0, c load immediate (c: 16 bit constant)
li r, 0xABCDEF00==> lui $at, 0xABCD和ori r, $at, 0xEF00 (c: 32 bit constant)
and $t0, $t0, 0xFFFFFF00==> lui $at, 0xFFFF
ori $at, 0xFF00
and $t0, $t0, $at
.ascii s ASCII encoded characters of string s
.asciiz s like .ascii, null-terminated
.word w1, w2, . . . 32-bit words w1, w2, . . .
.half h1, h2, . . . 16-bit halfwords h1, h2, . . .
.byte b1, b2, . . . 8-bit bytes b1, b2, . . .
.float f1, f2, . . . 32-bit single precision floating point numbers f1, f2, . . .
.double d1, d2, . . . 64-bit double precision floating point numbers d1, d2, . . .
.space n n zero bytes
使用la偽指令訪問資料區
la $t0, str
lb $t1, ($t0) # access byte at address $t0 (’f’)
add $t0, $t0, 3
lb $t2, ($t0) # access byte at address $t0 + 3 (’b’)
.data
str: .asciiz "foobar"
load word/halfword/byte at address a into target register r
lw r, a
lh r, a sign extension
lb r, a sign extension
lhu r, a no sign extension
lbu r, a no sign extension
store word/halfword/byte in register r at address a
sw r, a
sh r, a stores low halfword
sb r, a stores low byte
Example (copy a sequence of n bytes from address src to address dst):
.text
.globl __start
__start:
# length n of byte sequence - 1
li $t0, 5
copy:
lb $t1, src($t0) # pseudo! (src: 32 bits wide)
sb $t1, dst($t0)
sub $t0, $t0, 1
bgez $t0, copy
.data
src: .byte 0x11, 0x22, 0x33, 0x44, 0x55, 0x66
dst: .space 6
=========================================
mfc0 - move from c0
cfc0 - copy from c0
mfc0 t0,c0_status
lui at,0x1000
ori at,at,0x1f
or t0,t0,at
xori t0,t0,0x1f
mtc0 t0,c0_statu
於協處理器CP0的訪問,需要使用特別的指令。這些指令屬於“特權級指令”,只有在核心態(Kernel Mode)下才能執行。如果在使用者態下,會引起一個異常(Exception)。
對CP0的主要操作有以下的指令:
mfc0 rt, rd 將CP0中的rd暫存器內容傳輸到rt通用暫存器;
mtc0 rt, rd 將rt通用暫存器中內容傳輸到CP0中暫存器rd;
mfhi/mflo rt 將CP0的hi/lo暫存器內容傳輸到rt通用暫存器中;
mthi/mtlo rt 將rt通用暫存器內容傳輸到CP0的hi/lo暫存器中;
當MIPS體系結構演進到MIPS IV的64位架構後,新增了兩條指令dmfc0和dmtc0,向CP0的暫存器中讀/寫一個64bit的資料。
r4k MIPS CPU中和異常相關的控制暫存器(這些暫存器由協處理器cp0控制,有獨立的存取方法)有:
1.status 狀態暫存器
31 28 27 26 25 24 16 15 8 7 6 5 4 3 2 1 0
------------------------------------------------------------------
| cu0-3|RP|FR|RE| Diag Status| IM7-IM0 |KX|SX|UX|KSU|ERL|EXL|IE|
------------------------------------------------------------------
其中KSU,ERL,EXL,IE位在這裡很重要:
KSU: 模式位 00 -kernel 01--Supervisor 10--User
ERL: error level,0->normal,1->error
EXL: exception level,0->normal,1->exception,異常發生是EXL自動置1
IE: interrupt Enable, 0 -> disable interrupt,1->enable interrupt
(IM位則可以用於enbale/disable具體某個中斷,ERL||EXL=1 也使得中斷不能響應)
系統所處的模式由KSU,ERL,EXL決定:
User mode: KSU = 10 && EXL=0 && ERL=0
Supervisor mode(never used): KSU=01 && EXL=0 && ERL=0
Kernel mode: KSU=00 || EXL=1 || ERL=1
2.cause暫存器
31 30 29 28 27 16 15 8 7 6 2 1 0
----------------------------------------------------------------
|BD|0 | CE | 0 | IP7 - IP0 |0|Exc code | 0 |
----------------------------------------------------------------
異常發生時cause被自動設定
其中:
BD指示最近發生的異常指令是否在delay slot中
CE 發生coprocessor unusable異常時的coprocessor編號(mips有4個cp)
IP: interrupt pending, 1->pending,0->no interrupt,CPU有6箇中斷
引腳,加上兩個軟體中斷(最高兩個)
Exc code:異常型別,所有的外設中斷為0,系統呼叫為8,...
3.EPC
對一般的異常,EPC包含:
. 導致異常的指令地址(virtual)
or. if 異常在delay slot指令發生,該指令前面那個跳轉指令的地址
當EXL=1時,處理器不寫EPC
4.和儲存相關的:
context,BadVaddr,Xcontext,ECC,CacheErr,ErrorEPC
以後再說
一般異常處理程式都是先儲存一些暫存器,然後清除EXL以便巢狀異常,
清除KSU保持核心態,IE位看情況而定;處理完後恢復一些儲存內容以及CPU狀態
=========================================
=========================================
=========================================
MIPS 指令集(共 31條) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|