1. 程式人生 > >mips的32個暫存器

mips的32個暫存器

  MIPS comes with 32 general purpose registers named $0. . . $31
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
=========================================

http://www.mips-in-china.com/Study/ShowArticle.asp?ArticleID=147

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條)

MIPS 指令集(共31條)

助記符

指令格式

示例

示例含義

操作及其解釋

Bit #

31..26

25..21

20..16

15..11

10..6

5..0

R-type

op

rs

rt

rd

shamt

func

add

000000

rs

rt

rd

00000

100000

 add $1,$2,$3

 $1=$2+$3

 rd <- rs + rt   ;其中rs=$2,rt=$3, rd=$1

addu

000000

rs

rt

rd

00000

100001

 addu $1,$2,$3

 $1=$2+$3

 rd <- rs + rt   ;其中rs=$2,rt=$3, rd=$1,無符號數

sub

000000

rs

rt

rd

00000

100010

 sub $1,$2,$3

 $1=$2-$3

 rd <- rs - rt   ;其中rs=$2,rt=$3, rd=$1

subu

000000

rs

rt

rd

00000

100011

 subu $1,$2,$3

 $1=$2-$3

 rd <- rs - rt   ;其中rs=$2,rt=$3, rd=$1,無符號數

and

000000

rs

rt

rd

00000

100100

 and $1,$2,$3

 $1=$2 & $3

 rd <- rs & rt   ;其中rs=$2,rt=$3, rd=$1

or

000000

rs

rt

rd

00000

100101

 or $1,$2,$3

 $1=$2 | $3

 rd <- rs | rt   ;其中rs=$2,rt=$3, rd=$1

xor

000000

rs

rt

rd

00000

100110

 xor $1,$2,$3

 $1=$2 ^ $3

 rd <- rs xor rt   ;其中rs=$2,rt=$3, rd=$1(異或)

nor

000000

rs

rt

rd

00000

100111

 nor $1,$2,$3

 $1=~($2 | $3)

 rd <- not(rs | rt)   ;其中rs=$2,rt=$3, rd=$1(或非)

slt

000000

rs

rt

rd

00000

101010

 slt $1,$2,$3

 if($2<$3) 
  $1=1 else
   $1=0

 if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1

sltu

000000

rs

rt

rd

00000

101011

 sltu $1,$2,$3

 if($2<$3) 
  $1=1 else
   $1=0

 if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1
  (無符號數)

sll

000000

00000

rt

rd

shamt

000000

 sll $1,$2,10

 $1=$2<<10

 rd <- rt << shamt  ;shamt存放移位的位數,
  也就是指令中的立即數,其中rt=$2, rd=$1

srl

000000

00000

rt

rd

shamt

000010

 srl $1,$2,10

 $1=$2>>10

 rd <- rt >> shamt ;(logical) ,其中rt=$2, rd=$1

sra

000000

00000

rt

rd

shamt

000011

 sra $1,$2,10

 $1=$2>>10

 rd <- rt >> shamt  ;(arithmetic) 注意符號位保留
 其中rt=$2, rd=$1

sllv

000000

rs

rt

rd

00000

000100

 sllv $1,$2,$3

 $1=$2<<$3

 rd <- rt << rs  ;其中rs=$3,rt=$2, rd=$1

srlv

000000

rs

rt

rd

00000

000110

 srlv $1,$2,$3

 $1=$2>>$3

 rd <- rt >> rs  ;(logical)其中rs=$3,rt=$2, rd=$1

srav

000000

rs

rt

rd

00000

000111

 srav $1,$2,$3

 $1=$2>>$3

 rd <- rt >> rs  ;(arithmetic) 注意符號位保留
 其中rs=$3,rt=$2, rd=$1

jr

000000

rs

00000

00000

00000

001000

 jr $31

 goto $31

 PC <- rs

I-type

op

rs

rt

immediate

addi

001000

rs

rt

immediate

 addi $1,$2,100

 $1=$2+100

 rt <- rs + (sign-extend)immediate ;其中rt=$1,rs=$2

addiu

001001

rs

rt

immediate

addiu $1,$2,100

 $1=$2+100

 rt <- rs + (zero-extend)immediate ;其中rt=$1,rs=$2

andi

001100

rs

rt

immediate

 andi $1,$2,10

 $1=$2 & 10

 rt <- rs & (zero-extend)immediate ;其中rt=$1,rs=$2

ori

001101

rs

rt

immediate

 andi $1,$2,10

 $1=$2 | 10

 rt <- rs | (zero-extend)immediate ;其中rt=$1,rs=$2

xori

001110

rs

rt

immediate

 andi $1,$2,10

 $1=$2 ^ 10

 rt <- rs xor (zero-extend)immediate ;其中rt=$1,rs=$2

lui

001111

00000

rt

immediate

 lui $1,100

 $1=100*65536

 rt <- immediate*65536 ;將16位立即數放到目標暫存器高16
         位,目標暫存器的低16位填0

lw

100011

rs

rt

immediate

 lw $1,10($2)

 $1=memory[$2
 +10]

 rt <- memory[rs + (sign-extend)immediate] ;rt=$1,rs=$2

sw

101011

rs

rt

immediate

 sw $1,10($2)

 memory[$2+10]
 =$1

 memory[rs + (sign-extend)immediate] <- rt ;rt=$1,rs=$2

beq

000100

rs

rt

immediate

 beq $1,$2,10

 if($1==$2) 
 goto PC+4+40

 if (rs == rt) PC <- PC+4 + (sign-extend)immediate<<2 

bne

000101

rs

rt

immediate

 bne $1,$2,10

 if($1!=$2)
 goto PC+4+40

 if (rs != rt) PC <- PC+4 + (sign-extend)immediate<<2 

slti

001010

rs

rt

immediate

 slti $1,$2,10

 if($2<10) 
  $1=1 else
   $1=0

 if (rs <(sign-extend)immediate) rt=1 else rt=0 ;
   其中rs=$2,rt=$1

sltiu

001011

rs

rt

immediate

 sltiu $1,$2,10

 if($2<10) 
  $1=1 else
   $1=0

 if (rs <(zero-extend)immediate) rt=1 else rt=0 ;
  其中rs=$2,rt=$1

J-type

op

address

j

000010

address

 j 10000

 goto 10000

 PC <- (PC+4)[31..28],address,0,0   ;address=10000/4

jal

000011

address

 jal 10000

 $31<-PC+4;
 goto 10000

 $31<-PC+4;PC <- (PC+4)[31..28],address,0,0
   ;address=10000/4

注意:因為MIPS16只有16個16位的暫存器,所以JAL指令中$31改成$15, 所有立即數均無需擴充套件,LUI指令直接就是將立即數付給RT暫存器。