gpt4 book ai didi

将 C for 循环转换为 MIPS

转载 作者:太空狗 更新时间:2023-10-29 15:07:07 25 4
gpt4 key购买 nike

我正在尝试将此 C 代码直接转换为 mips,而不修改任何指令,以使其运行得更好:

for(i = 0; i != j; i += 2)
b[i] = a[i] - a[i + 1]

我真的不会用 mips 编码,我只是想了解一些事情。这是我目前所拥有的(不多):

#t5 = i
$t6 = j
#t1 = a
#t2 = b
#t3 = c
#t10, t11, t12 = free

add $t5, $zero, $zero # initialize i = 0

loop:
bne $t5, $t6 # check if i is not equal to j
addi $t5, $t5, 2 # i += 2
add $t10, $t5, $t11 # temp reg $t10 = address of b[i]
lw $t2, 0($t10) # temp reg $t2 = b[i]
add $t10, $t5, $t12 # temp reg $t10 = address of a[i]
lw $t1, 0($t10) # temp reg $t1 = a[i]

不确定 bne 是否正确,因为我没有指定要分支到的任何地方。我已经阅读了 mips 中的数组,但它让我感到困惑。我知道在将数组放入寄存器时我需要使用正确的字节寻址偏移量。数组中的变量而不是数字是否相同?任何方向或提示都会很好。谢谢!

最佳答案

您猜对了,bne 需要一个分支到的位置。所以你的程序至少还需要一个标签。在下面的示例中,该新标记称为“exit”。

关于加载和存储中的寻址,我同意你的看法;一开始它可能会有点困惑(特别是如果您习惯了 c 样式的数组索引)。如果您的偏移量不是常量,那么您必须执行加(或减)操作来获取地址。我们以a[i + 1]的地址为例:首先需要将a的地址与i相加并存储到某处,然后可以使用常量偏移加载(或存储)到真实地址。我重写了你的例子,这样你就能明白我在说什么;这是通过示例比通过解释更容易理解的事情之一:)

#t5 = i
#t6 = j
#t1 = address of a
#t2 = address of b
#t10, t11, t12 = free

#START
move $t5,$0 #set $t5 to zero

loop:
bne $t5,$t6,exit #if $t5 not equal to $t6 branch to exit
addi $t10,$t1,$t5 #temp reg $t10 = address of a[i]
lw $t11,1($t10) #temp reg $t11 = a[i + 1]
lw $t12,0($t10) #temp reg $t12 = a[i]
sub $t10,$t12,$t11 #temp reg $t10 = a[i] - a[i + 1]
addi $t11,$t2,$t5 #temp reg $t11 = address of b[i]
sw $t10,0($t11) #store word b[i] = a[i] - a[i + 2]
addi $t5,$t5,2 #i+=2
j loop #jump to start of loop
exit:

关于将 C for 循环转换为 MIPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com