【问题标题】:Is my understanding of lw instruction in MIPS correct?我对 MIPS 中 lw 指令的理解是否正确?
【发布时间】:2019-08-07 12:16:20
【问题描述】:

我刚刚开始了解 MIPS,特定指令“lw”让我感到困惑。

从线程Understanding how `lw` and `sw` actually work in a MIPS program,这是我收集到的:

如果我们有:

lw a, 4(b) // a and b are registers

然后,它只是意味着我们将在b的内存地址处获取数据(或通常称为“单词”,我仍然不明白为什么......)增加4。然后,将其存储在a中。简单来说,就是在b的地址之后的地址获取下一个存储的数据,因为每个“字”是4个字节。

还有,这是否意味着b中存储的数据应该是一个数据结构,比如数组?这样我们就可以得到b+4这个内存地址的数据了?

抱歉,我知道我的措辞很混乱……但我是否走在正确的轨道上?谁能用简单的术语向我解释一下“单词”到底是什么?基本上是数据吗?

【问题讨论】:

    标签: assembly mips cpu-registers instruction-set


    【解决方案1】:

    你在正确的轨道上。 一个“字”是 4 个字节的数据。

    lw a, 4(b)
    

    该指令从 b 中的地址加载一个字,偏移量为 4。如果在该地址上是一个像“数组”这样的数据结构,但它不是必需的,这将是有意义的。取决于你想要达到的目标。

    我会给你一个简短的例子:

    .globl main
    
    .data
        array: .word 1, 2, 3, 4, 5, 6,    # numbers
    
    .text
    main:
        addi $t0, $0, 0                 # p value in $t0
        addi $t1, $0, 0                 # array in $t1
    
        la $t1, array                      # load array into $t1
        lw $t0, 0($t1)                  # load first word into $t0 --> 1
        lw $t0, 4($t1)                  # load second word into $t0 --> 2
    
        addi $t1, $t1, 4                    # increase address  += 4
        lw $t0, 0($t1)                  # load first word into $t0 --> 2
        lw $t0, 4($t1)                  # load second word into $t0 --> 3
    
        addi $v0, $0, 10                    # load exit syscall 
        syscall                                     
    

    假设数组从示例地址 1000 开始,我们使用伪指令 la 将该地址加载到 $t1 中。 lw $t0, 0($t1) 将第一个字加载到 $t0(从示例地址 1000 - 1003 加载数据)。 lw $t0, 4($t1) 将第二个字加载到 $t0 中(从示例地址 1004 - 1007 加载数据)。

    您可以使用http://spimsimulator.sourceforge.net/ 来调试程序。它会告诉你哪个地址实际上在 b 中。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2018-04-27
      • 1970-01-01
      相关资源
      最近更新 更多