mips的32个寄存器

来源:互联网 发布:象过河软件终身免费版 编辑:程序博客网 时间:2024/05/16 16:23
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 OS kernel
$27 $k1 reserved for OS kernel
$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寄存器。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玩战地1帧数太低怎么办 战地1点游戏不开怎么办 ios耳机孔坏了怎么办? 吃泻药都不排便怎么办 上司离职了我该怎么办 我上司要辞职我怎么办 一方坚决不同意离婚我该怎么办 模拟农场车翻了怎么办 手机退出键坏了怎么办 dnf邮件发错了怎么办 手机提示sd卡已损坏怎么办 解压包文件数据损坏该怎么办 电脑被压缩后电脑打不开怎么办 眼睛里进了飞虫怎么办 虫子飞到眼睛里怎么办 云电脑pc版双鼠标怎么办 电脑蓝屏代码7f怎么办 笔记本电脑蓝屏开不了机怎么办 装xp系统后蓝屏怎么办 一键ghost断电了怎么办 如何防止cpu降频怎么办 win7 64位系统不兼容怎么办 网页无法加载打印机插件怎么办 微信提示安装了插件怎么办 电脑上不了网怎么办 win10 win10电脑突然没网了怎么办 笔记本玩战争前线发热严重怎么办 玩战争前线总是闪退怎么办 uu加速器卡在29怎么办 新ipad下载不了东西怎么办 福昕pdf阅读器找不到图章怎么办 战地4没达到分数怎么办 植物在太暗环境怎么办 玩绝地求生机型不支持怎么办 安卓安装包损坏怎么办 方舟手游安装包损坏怎么办 7p新机耗电快怎么办 不小心把图片删了怎么办 腿上毛又长又多怎么办 征兵体检体重太轻怎么办 体检发现颈部有淋巴节怎么办?