[英]Assembly Language implementation of C instruction
我正在尝试翻译A[2*i]=A[2*k+j];
汇编语言。 int数组“ A”(四个字节)从地址Astart
(32位)开始, i, j, k
存储在$s0, $s1, $s3
。
因此,如果我正确地理解了这个问题,我需要将[2*k+j]
元素的地址和值设置为[2*i]
元素吗? 我的困惑是修改地址。 这就是我所拥有的:
add $t0, $s0, $s0 #2*i
add $t1, $s3, $s3 #2*k
add $t2, $t1, $s3 #2*k+j
sw $t2, Astart
sw $t0 4(Astart)
这个对吗?
这里需要两个步骤,第一步是从A[2*k+j]
加载,第二步是存储在A[2*i]
。
您已经计算了2*i
和2*k+j
,但是忘记了乘以4(因为32位整数的每个元素的偏移量是4个字节)。
更正后的代码可能类似于:
add $t0, $s0, $s0 #2*i
add $t1, $s3, $s3 #2*k
add $t2, $t1, $s3 #2*k+j
sll $t1 $t1 2
sll $t2 $t2 2
la $t0 Astart
add $t3 $t0 $t1 #Address of A[2*k]
add $t4 $t0 $t2 #Address of A[2*k+j]
lw $t0 0($t3)
sw $t0 0($t4)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.