我正在阅读MIPS手册: “请注意,我们使用”add immediate“指令的”unsigned“版本,因为我们正在处理一个地址,这是一个无符号二进制数。我们不希望仅仅因为计算的地址越过中间而产生异常记忆空间的一点。“
这究竟是什么意思?特别是越过内存空间的中点。
而且,在下面的代码中,我不明白为什么它从8($ sp)跳到20($ sp)。代码后来从12($ sp)和16($ sp)加载,但什么时候用这些内存部分做什么。我在jal JILL中想到了可能,但是没有给出太多解释。
addiu $sp, $sp, -24
sw $t1, 0($sp)
sw $t2, 4($sp)
sw $t3, 8($sp)
sw $ra, 20($sp)
jal JILL
lw $ra, 20($sp)
lw $t4, 12($sp)
lw $t5, 16($sp)
addiu $sp, $sp, 24
答案 0 :(得分:1)
假设MIPS32架构具有32位地址空间,内存空间的中点将是地址0x80000000(即2 ^ 31)。 在32位带符号(A2-compliment)算术中,从0到0x7FFFFFFF的整数保留用于正数,其中从0x80000000到0xFFFFFFFF的整数保留用于负数。
当您发出签名添加时,如果添加的结果“越过”该中点,则会出现溢出异常。但在你的例子中,你实际上是处理内存地址,而不是有符号数...因此地址的符号(解释为32位数字)是没有意义的,所以你应该使用无符号加法。
关于你的第二个问题,你必须查看JILL程序以查看它的作用......当然,该程序会在12($sp)
和16($sp)