MIPS通过变量进行偏移

时间:2013-09-20 03:28:39

标签: variables mips offset

当我使用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部分是我真的很困惑的地方。

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

3 个答案:

答案 0 :(得分:4)

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

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]

答案 1 :(得分:1)

假设$ s0存储i和$ s1存储j。 A&基地址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]

答案 2 :(得分:0)

我不认为这是正确的,在ASM语言中你没有“变量”你必须访问包含i和j的寄存器,你通常有一个指向基数组的指针,这似乎是$ s6 ,你的偏移量丢失,并且没有正确计算,你用什么临时寄存器计算add $ t2,$ base,$ offset,各自在他们自己的寄存器中,然后使用(What 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)