首页 > 解决方案 > 将 C 数组访问转换为 MIPS

问题描述

问题是:

假设数组A和的基地址B分别在寄存器$s6$s7中。

变量fg分别分配给寄存器$s0, $s1

以下 C 代码对应的 MIPS 汇编代码是什么:f = g - A[B[4]];

我的想法是:

lw $t0, 16($s7) # $t0 = B[4]
lw $t1, 64($s6) # $t1 = A[B[4]]
sub $s0, $s1, $t1 # $s0 = $s1 - $t1

我在这个答案上错了,我不知道为什么。有人可以帮我一个想法或解释吗?

标签: arraysassemblymips

解决方案


很好的尝试,但是您的代码不正确,因为$t0已加载但从未使用过。我也不确定数字 64 来自哪里,但基本上这应该是从B[4],中提取的值$t0

您可能会对嵌套数组访问感到困惑A[B[4]]。从概念上讲,这是使用存储在中的值B[4]作为索引A。最好将其扩展并从每行单个操作的 C 代码开始:

t0 = B[4];
t1 = A[t0];
f = g - t1;

现在更容易提出:

lw $t0, 16($s7)    # B_val = B[4]
sll $t0, $t0, 2    # B_val *= 4
addu $t2, $t0, $s6 # A_offset = B_val + A_base
lw $t1, ($t2)      # A_val = A[A_offset]
sub $s0, $s1, $t1  # f = g - A_val

在这里,我假设该B值需要乘以 4。

你总是可以编写一个程序来验证你的工作(至少,在考试之后):

    .data
A: .word 1, 1, 1, 1, 24
B: .word 1, 1, 1, 1, 4

    .text
main:
    la $s6 A           # A_base
    la $s7 B           # B_base
    li $s1, 42         # g = 42

    lw $t0, 16($s7)    # B_val = B[4]
    sll $t0, $t0, 2    # B_val *= 4
    addu $t2, $t0, $s6 # A_offset = B_val + A_base
    lw $t1, ($t2)      # A_val = A[A_offset]
    sub $s0, $s1, $t1  # f = g - A_val

    li $v0, 1
    move $a0, $s0
    syscall            # => should be 42 - 24 = 18

    li $v0, 10
    syscall

推荐阅读