【发布时间】:2016-09-21 22:26:57
【问题描述】:
我是一名学习 mips 的学生,我对内存访问和加载的工作原理有一些疑问。
在我们的第一个作业中,我们使用了这个宏
sw $a0, numargs
lw $t0, 0($a1)
sw $t0, arg1
lw $t0, 4($a1)
sw $t0, arg2
lw $t0, 8($a1)
sw $t0, arg3
这个宏的工作是获取我们加载到 mips 中的参数。它有效,但我对它的工作原理更加好奇,因为教授从未真正解释过它,只是告诉我们使用它。
所以在“程序参数”字段中,我将输入三个参数。 MIPS 是否立即使用 a0 作为参数的数量,这就是为什么我们可以将其存储在我们自己的变量中?
那么每个参数都有自己的内存地址。寄存器 $a1 是否结合了参数内存地址的所有最后 4 位?这样,我们每次跳转 4 位以获取一个新参数,然后将该参数存储在我们自己的变量中。
还加载词让我有点困惑
例如在这个sn-p的代码中
lw $t0, arg2
lb $t1, 3($t0)
move $a0, $t1
addi $v0, $0, 11
syscall
它工作正常。我将 t1 设置为 t0 的最后一个字节(因此是参数的最后一个字符)并且它打印正确。所以如果参数是 1234,它会打印 4。
但是当我尝试添加时
sll $t0, $t0, 8
在第一行之后,它不起作用。我不明白为什么。我将 $t0 移动了 8 位。所以最后一个字节被擦除,“3”应该是最后一个字节和打印的内容。但它给了我一个错误。
【问题讨论】:
标签: assembly mips mars-simulator