关于mips和内存的一些简单问题?

时间:2016-09-21 22:26:58

标签: assembly mips mars

我是一名学习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”应该是最后一个字节和打印的内容。但它给了我一个错误。

1 个答案:

答案 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处的内存字节,您的程序可能不允许阅读。