我是一名学习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”应该是最后一个字节和打印的内容。但它给了我一个错误。
答案 0 :(得分:0)
该特定宏不是MIPS编程的标准做法,仅对此特定类有用。
序列:
lw $t0, arg2
lb $t1, 3($t0)
不符合您的想法。 lw $t0, arg2
将位置arg2
的内存值加载到$t0
。因此,如果位置arg2
的内存字的值为1024(十进制),则$t0
将设置为1024。
lb $t1, 3($t0)
将内存字节加载到$t0
中包含的地址,并将其放入$t1
。如果$t0
包含值1024,那么addess 1024 + 3 = 1027的内存字节将被放入$t1
。
在sll $t0, $t0, 8
之后添加lw
会将$t0
的值从1024更改为262144.然后lb
将尝试读取262144 + 3处的内存字节,您的程序可能不允许阅读。