算术说明
MIPS 支持四种基本算术运算:加法、减法、乘法和
分工。
加法说明:基本加法说明
add Rdest,Rsrc1,Rsrc2
将Rsrc1 和Rsrc2 的内容相加,并将结果存储在Rdest 中。这些数字被视为有符号整数。如果发生溢出,则会产生溢出异常。如果不需要溢出异常,可以使用addu。
第二个操作数可以指定为immediate 16-bit number。格式为:
addi Rdest,Rsrc1,imm
16-bit 的值为 sign-extended to 32 bits,并添加到 Rsrc1 的内容中。与 add 指令一样,会产生溢出异常。如添加,如果不需要溢出异常,我们可以使用addiu。
堆栈实现
MIPS 不明确支持堆栈操作。相比之下,它
提供push、pop等指令,方便堆栈操作。此外,还有一个特殊的堆栈指针寄存器sp,用于保存栈顶信息。在 MIPS 中,寄存器起到堆栈指针的作用。我们必须操作这个寄存器来实现堆栈。
例如,堆栈向下增长(即,当我们将项目压入堆栈时,地址减少)。因此,当在堆栈上为压入值保留空间时,我们必须减小sp 的值。因此,堆栈指针在执行开始时的相对值可以取为零。
例如,要推送寄存器a0和ra,我们必须预留8字节的堆栈空间,并使用sw来推送值,如下所示:
sub $sp,$sp,8 # reserve 8 bytes of stack
sw $a0,0($sp) # save registers
sw $ra,4($sp)
此序列通常在程序开始时使用以保存寄存器。要在从程序返回之前恢复这些寄存器,我们可以使用以下序列:
lw $a0,0($sp) # restore the two registers
lw $ra,4($sp)
addu $sp,$sp,8 # clear 8 bytes of stack
那么,第一个问题的答案:
16-bit 的值为sign-extended to 32 bits,并添加到Rsrc1 的内容中。
关于你的第二个问题:
因此,堆栈指针在执行开始时的相对值可以取为零。