当我使用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,但我不知道如何使用
答案 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)