MIPS算数运算只对寄存器操作,因此必须将存储器中的值取出到寄存器(取字),并将运算结果存回存储器(存字)。
程序中使用的变量数远大于寄存器的个数,因此编译器会将不常用的变量存储在存储器,需要时再通过数据传输指令从存储器取出,计算后存回存储器。
取字
MIPS
// $s1 = Memory[$s2 + 20]
lw $s1, 20 ($s2)
指令:
100011 10010 10001 0000000000010100
偏移量
20
相当于取下标5
(4 * 5 = 20)
例:
// C语言
g = h + A[8]
// MIPS
lw $t0, 32 ($s3)
add $s1, $s2, $t0
- 变量
A
的地址存放在基址寄存器$s3
中。 - 由于MIPS是 字节寻址,基址寄存器相加的偏移量必须是 ,即 ,才能正确读到
A[8]
存字
MIPS
// Memory[$s2 + 20] = $s1
sw $s1, 20 ($s2)
指令:
101011 10010 10001 0000000000010100
例:
// C语言
A[12] = h + A[8]
// MIPS
lw $t0, 32 ($s3)
add $t0, $s2, $t0
sw $t0, 48 ($s3)