【问题标题】:Some simple questions about mips and memory?关于 mips 和内存的一些简单问题?
【发布时间】: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


    【解决方案1】:

    那个特定的宏不是 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

    lw 之后添加sll $t0, $t0, 8 会将$t0 的值从1024 更改为262144。然后lb 将尝试读取262144 + 3 处的内存字节,您的程序可能不允许这样做阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      相关资源
      最近更新 更多