我是一名学生学习mips,我有几个关于内存访问和加载工作的问题。关于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位以获得新的参数,然后将该参数存储在我们自己的变量中。
而且加载字混淆了我一点点
例如,在这个代码片段
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”应该是最后一个字节和打印内容。但它给了我一个错误。