2016-09-21 63 views
0

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

回答

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,则地址1024 + 3 = 1027处的存储器字节将被放入$t1

添加lwsll $t0, $t0, 8会的$t0值从1024更改为262144然后lb会试图读取在262144 + 3的内存字节,该程序可能是读不准。