0

我在 MIPS 手册中读到:“请注意,我们使用“添加立即数”指令的“无符号”版本,因为我们正在处理一个地址,它是一个无符号二进制数。我们不想只生成异常因为计算的地址越过了内存空间的中点。”

这到底是什么意思?特别是跨越内存空间的中点。

而且,在下面的代码中,我不明白为什么它会从 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
4

1 回答 1

1

假设具有 32 位地址空间的 MIPS32 架构,内存空间的中点将是地址 0x80000000(即 2^31)。在 32 位有符号(A2-compliment)算术中,从 0 到 0x7FFFFFFF 的整数保留给正数,而从 0x80000000 到 0xFFFFFFFF 的整数保留给负数。

当你发出一个有符号的加法时,如果加法的结果“越过”那个中点,你会得到一个溢出异常。但是在您的示例中,您实际上是在处理内存地址,而不是带符号的数字……因此,地址的符号(解释为 32 位数字)是没有意义的,因此您应该使用无符号加法。

关于您的第二个问题,您必须查看 JILL 程序以查看它的作用......该程序肯定会在12($sp)16($sp)

于 2013-02-18T14:04:10.560 回答