每次学计组的时候总要去查MIPS的寄存器和指令,索性自己总结了如下的知识点,方便之后查看
32个通用寄存器
Register | Name | Usage |
---|
$0 | $zero | 常量0(constant value 0) |
$1 | $at | 保留给汇编器(Reserved for assembler) |
$2-$3 |
v
0
−
v0-
v0−v1 | 函数调用返回值(values for results and expression evaluation) |
$4-$7 |
a
0
−
a0-
a0−a3 | 函数调用参数(arguments) |
$8-$15 |
t
0
−
t0-
t0−t7 | 暂时的(或随便用的) |
$16-$23 |
s
0
−
s0-
s0−s7 | 保存的(或如果用,需要SAVE/RESTORE的)(saved) |
$24-$25 |
t
8
−
t8-
t8−t9 | 暂时的(或随便用的) |
$28 | $gp | 全局指针(Global Pointer) |
$29 | $sp | 堆栈指针(Stack Pointer) |
$30 | $fp | 帧指针(Frame Pointer) |
$31 | $ra | 返回地址(return address) |
32个寄存器(详细)
Register Name | Number | Usage |
---|
$zero | 0 | Constant 0 |
$at | 1 | Reserved for assembler |
$v0 | 2 | Expression evaluation and results of a function |
$v1 | 3 | Expression evaluation and results of a function |
$a0 | 4 | Argument 1 |
$a1 | 5 | Argument 2 |
$a2 | 6 | Argument 3 |
$a3 | 7 | Argument 4 |
$t0 | 8 | Temporary (not preserved across call) |
$t1 | 9 | Temporary (not preserved across call) |
$t2 | 10 | Temporary (not preserved across call) |
$t3 | 11 | Temporary (not preserved across call) |
$t4 | 12 | Temporary (not preserved across call) |
$t5 | 13 | Temporary (not preserved across call) |
$t6 | 14 | Temporary (not preserved across call) |
$t7 | 15 | Temporary (not preserved across call) |
$s0 | 16 | Saved temporary (preserved across call) |
$s1 | 17 | Saved temporary (preserved across call) |
$s2 | 18 | Saved temporary (preserved across call) |
$s3 | 19 | Saved temporary (preserved across call) |
$s4 | 20 | Saved temporary (preserved across call) |
$s5 | 21 | Saved temporary (preserved across call) |
$s6 | 22 | Saved temporary (preserved across call) |
$s7 | 23 | Saved temporary (preserved across call) |
$t8 | 24 | Temporary (not preserved across call) |
$t9 | 25 | Temporary (not preserved across call) |
$k0 | 26 | Reserved for OS kernel |
$k1 | 27 | Reserved for OS kernel |
$gp | 28 | Pointer to global area |
$sp | 29 | Stack pointer |
$fp or s8 | 30 | Frame pointer |
$ra | 31 | Return address (used by function call) |
MIPS指令集(31条)
助记符 | 用法 | 解释 | 注释 |
---|
R-type | | | |
add | add $1,$2,$3 | $1=$2+$3 | 其中rs=$2,rt=$3, rd=$1 |
addu | addu $1,$2,$3 | $1=$2+$3 | 其中rs=$2,rt=$3, rd=$1,无符号数 |
sub | sub $1,$2,$3 | $1=$2-$3 | 其中rs=$2,rt=$3, rd=$1 |
subu | subu $1,$2,$3 | $1=$2-$3 | 其中rs=$2,rt=$3, rd=$1,无符号数 |
and | and $1,$2,$3 | $1=$2 & $3 | 其中rs=$2,rt=$3, rd=$1 |
or | or $1,$2,$3 | $1=$2 | $3 | 其中rs=$2,rt=$3, rd=$1 |
xor | xor $1,$2,$3 | $1=$2 ^ $3 | 其中rs=$2,rt=$3, rd=$1(异或) |
nor | nor $1,$2,$3 | $1=~($2|$3) | ;其中rs=$2,rt=$3, rd=$1(或非) |
slt | 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 | 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 | sll $1,$2,10 | $1=$2<<10 | rd <- rt << shamt ;shamt存放移位的位数, 也就是指令中的立即数,其中rt=$2, rd=$1 |
srl | srl $1,$2,10 | $1=$2>>10 | rd <- rt >> shamt ;(logical) ,其中rt=$2, rd=$1 |
sra | sra $1,$2,10 | $1=$2>>10 | rd <- rt >> shamt ;(arithmetic) 注意符号位保留 其中rt=$2, rd=$1 |
sllv | sllv $1,$2,$3 | $1=$2<<$3 | rd <- rt << rs ;其中rs=$3,rt=$2, rd=$1 |
srlv | srlv $1,$2,$3 | $1=$2>>$3 | rd <- rt >> rs ;(logical)其中rs=$3,rt=$2, rd=$1 |
srav | srav $1,$2,$3 | $1=$2>>$3 | rd <- rt >> rs ;(arithmetic) 注意符号位保留 其中rs=$3,rt=$2, rd=$1 |
jr | jr $31 | goto $31 | PC <- rs |
I-type | | | |
addi | addi $1,$2,100 | $1=$2+100 | rt <- rs + (sign-extend)immediate ;其中rt=$1,rs=$2 |
addiu | addiu $1,$2,100 | $1=$2+100 | rt <- rs + (zero-extend)immediate ;其中rt=$1,rs=$2 |
andi | andi $1,$2,10 | $1=$2 & 10 | rt <- rs & (zero-extend)immediate ;其中rt=$1,rs=$2 |
ori | andi $1,$2,10 | $1=$2 | 10 | rt <- rs | (zero-extend)immediate ;其中rt=$1,rs=$2 |
xori | andi $1,$2,10 | $1=$2 ^ 10 | rt <- rs xor (zero-extend)immediate ;其中rt=$1,rs=$2 |
lui | lui $1,100 | $1=100*65536 | rt <- immediate*65536 ;将16位立即数放到目标寄存器高16 位,目标寄存器的低16位填0 |
lw | lw $1,10($2) | $1=memory[$2 +10] | rt <- memory[rs + (sign-extend)immediate] ;rt=$1,rs=$2 |
sw | sw $1,10($2) | memory[$2+10] =$1 | memory[rs + (sign-extend)immediate] <- rt ;rt=$1,rs=$2 |
beq | beq $1,$2,10 | if($1==$2) goto PC+4+40 | if (rs == rt) PC <- PC+4 + (sign-extend)immediate<<2 |
bne | bne $1,$2,10 | if($1!=$2) goto PC+4+40 | if (rs != rt) PC <- PC+4 + (sign-extend)immediate<<2 |
slti | 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 | 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 | | | |
j | j 10000 | goto 10000 | PC <- (PC+4)[31…28],address,0,0 ;address=10000/4 |
jal | jal 10000 | $31<-PC+4; goto 10000 | $31<-PC+4;PC <- (PC+4)[31…28],address,0,0 ;address=10000/4 |
其他指令
助记符 | 用法 | 解释 | 注释 |
---|
bnez | bnez $t0 ,trylk | if $t0 != 0 ,goto trylk | |
beqz | beqz $t0 ,trylk | if $t0 ==0, goto trylk | |
伪指令 | | | |
not | not $1,$2 | 对应MIPS,nor $1,
2
,
2,
2,zero | 或非操作 |
move | move $1,$2 | 对应MIPS , or $1,
2
,
2,
2,zero | |
li | li $1,$2 | 对应MIPS,ori
1
,
1,
1,zero,c | c为16位立即数 |
会不断更新~
若有错误,不吝指正~