我知道这里有一个类似的问题。我想将其视为该问题的延续,但更彻底。
这是我想翻译成 MIPS的 C 代码的相关部分:
int a = [100];
...
j = 0;
while (j<50){
if (a[j] > a[99-j]) {
tmp = a[99-j];
a[99-j] = a[j];
a[j] = tmp;
}
j = j+1;
}
(所以它基本上像反向一样工作)
到目前为止,我已经在MIPS中完成了:
.data
array: .word 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80,
79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60,
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40,
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20,
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,0
.text
.globl main
main:
la $s1, array # $s1 = array address
la $s3, array
li $s0, 0 # j = 0
lw $t0, 0($s1) # $t0 = a[0]
lw $t1, 396($s3) # $t1 = a[99]
while: beq $s0, 50, end # break from while loop once j = 50
if: blt $t0, $t1, iterj # if the if statement not satisfied, branch to iterj
sw $t1, 0($s1) # write to a[99-j]
sw $t0, 396($s1) # write to a[j]
iterj: addi $s0, $s0, 1 # increment j
addi $s1, $s1, 4 # increment source address starting with j = 0
addi $s3, $s3, -4 # decrement source address starting with j = 99
lw $t0, 0($s1)
lw $t1, 396($s3)
j while
end:
概括我在 MIPS 中所做的
基本上,我尝试在 $s1 中初始化数组并尽我所能对其进行交换。然后我意识到我还需要增加 a[0] 处的源地址,同时减少 a[99] 处的源地址。所以我在想我不能只使用 1 个数组,然后我在 $s3 中创建了一个相同的数组来处理它:
addi $s1, $s1, 4 # increment source address starting with j = 0
addi $s3, $s3, -4 # decrement source address starting with j = 99
现在是我需要帮助的部分:
代码从 0 到 31(全部以十六进制形式显示在 MARS 中)按顺序工作(正确交换),然后从 31 到 1,然后突然从 63 到 47。显然我做错了。我只需要它做的就是通过 swapping 返回 0 到 63(十六进制)或 0 到 99(十进制)。有什么提示吗?