Last Updated: 2023-12-08 13:03:20 Friday
-- TOC --
MIPS架构知识点:
32位MIPS架构共32个通用寄存器,从0开始编号,其命名规则如下:
命名 | 编号 |
---|---|
$zero | $0 |
$at | $1 |
$v0 | $2 |
$v1 | $3 |
$a0 | $4 |
$a1 | $5 |
$a2 | $6 |
$a3 | $7 |
$t0 | $8 |
$t1 | $9 |
$t2 | $10 |
$t3 | $11 |
$t4 | $12 |
$t5 | $13 |
$t6 | $14 |
$t7 | $15 |
$s0 | $16 |
$s1 | $17 |
$s2 | $18 |
$s3 | $19 |
$s4 | $20 |
$s5 | $21 |
$s6 | $22 |
$s7 | $23 |
$t8 | $24 |
$t9 | $25 |
$k0 | $26 |
$k1 | $27 |
$gp | $28 |
$sp | $29 |
$fp | $30 |
$ra | $31 |
MIPS浮点数部分,有另外32个用于浮点数计算的寄存器,也许我们应该将浮点数看做一个CPU内部相对独立的部分,正如x86-64中的SIMD部分一样。只不过,编译器能很好的编译浮点数计算,确不能够自动编译出SIMD指令(也许未来会实现)。CPU内部的这些相对独立的部分越来越多,比如我们说的核显,集成的GPU,还有集成的NPU。这就是异构计算吧...难为了程序员,如何充分调用CPU的内部的计算资源,成了一个问题...
$0
永远为0$a0 -- $a3
用来pass parameters$v0 -- $v1
用来保存return value$ra
表示return address$t0 -- $t9
,t是temp,属于caller-save寄存器$s0 -- $s7
,s是save,属于callee-save寄存器$sp
,stack pointer$fp
,frame pointer所有指令均统一4字节长!
6 5 5 5 5 6
R: | op | rs | rt | rd | shamt | funct |
I: | op | rs | rt | imm or address |
J: | op | address |
op
: opcoders
: the first register operand (base address in I type)rt
: the second register operand (target in lw instruction)rd
: destination register operandshamt
: shift amount (shift指令使用)funct
: function code, selects the specific variant of the operation in the op fieldimm or address
: 按补码的方式编码16bits
正负整数。如果是branch指令,beq
或bne
,采用PC-relative寻址,此时这16bits表达的补码,要乘4,再加上PC的值(下一条指令地址)得到目的地址。只有j
和jal
这两条指令使用J-format,此时寻址也是PC-relative方式,PC的值为当前指令地址+4,即下一条指令的地址,但只需要PC的前4bits,26bits
的地址,需要乘4,即左移2位,得到28位地址,加上PC的前4位,组合乘32位地址。
推荐一个还不错的在线MIPS模拟器:https://cpulator.01xz.net/?sys=mipsr5-spim
现在一些大学依然采用MIPS教学,在做Lab的时候,需要了解MIPS体系的系统调用,来实现在模拟器上的输入和输出。MIPS系统调用整理如下表:
system call | Code in $v0 | Arguments | Result |
---|---|---|---|
print_int | 1 | $a0=integer | |
print_float | 2 | $f12=float | |
print_double | 3 | $f12=double | |
print_string | 4 | $a0=address of string | |
read_int | 5 | int in $v0 | |
read_float | 6 | float in $f0 | |
read_double | 7 | double in $f0 ? | |
read_string | 8 | $a0=buffer address, $a1=length | |
sbrk | 9 | $a0=amount | address in $v0 |
exit | 10 |
这些应该足够应付Lab了...
本文链接:https://cs.pynote.net/hd/asm/202310145/
-- EOF --
-- MORE --