5

当我使用 4 字节偏移量加载变量时,如何将该变量加载到数组中?

例如...如果我有 C 赋值语句:

B[8] = A[i] + A[j]

lw $t0, 4j($s6)    # load A[j] into $t0
lw $ti, 4i($s6)    # load A[i] into $t1
add $t0, $t0, $t1  # Register $t0 gets A[i] + A[j]
sw $t0, 32($s7)    # Stores A[i] + A[j] into B[8]

这是为变量进行偏移的正确方法吗?4j 和 4i 部分是我真正感到困惑的地方。

编辑:i 和 j 有寄存器 $s3 和 $s4,但我不知道如何使用

4

3 回答 3

6

你非常接近,你只需要计算偏移量:

li $s2, 4         # put constant 4 in s2
multu $s2, $s3    # multiply s3 by 4
mflo $s3          # put multiplication result back in s3
multu $s2, $s4    # multiply s4 by 4
mflo $s4          # put multiplication result back in s4
add $s4, $s6, $s4 # s4 = pointer to A[j]
add $s3, $s6, $s3 # s3 = pointer to A[i]
lw $t0, ($s4)     # load A[j] into t0
lw $t1, ($s3)     # load A[i] into t1
add $t0, $t0, $t1 # t0 = A[j] + A[i]
sw $t0, 32($s7)   # B[8] = A[i] + A[j]
于 2013-09-20T03:43:09.137 回答
4

假设$s0商店i$s1商店jA和的基地址B分别为 。$s6$s7

sll $t0, $s0, 2    #offsets 4*i
sll $t1, $s1, 2    #offsets 4*j
add $t0, $t0, $s6  #Pointer to A[i]
add $t1, $t1, $s6  #Pointer to A[j]
lw $t0, 0($t0)     #loads A[i] to $t0
lw $t1, 0($t1)     #loads A[j] to $t1

add $t2, $t1, $t0  #A[i]+A[j]

sw $t2, 32($s7)    #stores A[i]+A[j] to B[8]
于 2013-10-30T18:06:12.290 回答
0

我认为这是不正确的,在 ASM 语言中,你没有“变量”,你必须访问一个包含 i 和 j 的寄存器,你通常有一个指向基本数组的指针,它似乎是 $s6,你的偏移量丢失,并且计算不正确,您使用临时寄存器来计算添加 $t2,$base,$offset,每个都在自己的寄存器中,然后使用(4i 的意思是数字,即 4*i , 4j 是一个 4*j 的数字,但不能直接输入,变量也是,包含在寄存器中) lw $ti, $t2

明白了吗?该 asm 假设您正在执行 i 和 j 乘法,例如 4*i 和 4*j 作为偏移量,但偏移量不能是寄存器,所以您要做的是添加 4(字节),假设数组中的每个元素都有大小4字节。假设 4*i 和 4*j 的结果分别在 $t4 和 $t5 中:

add $t1, $s6, $t4
lw $t2, $t1
add $t1, $s6, $t5
lw $t3, $t1
add $t0, $t2, $t3
sw $t0, 32($s7)
于 2013-09-20T03:44:21.393 回答