2

我知道这里有一个类似的问题。我想将其视为该问题的延续,但更彻底。

这是我想翻译成 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(十进制)。有什么提示吗?

4

1 回答 1

2

好吧,您要求两个数组是错误的,但是您得出了这样的结论。请记住,任何可以用 C 编写的东西都可以用汇编编写,因此您提供的 C 代码应该用作模型。

- -编辑

我首先建议的是加载数组的地址,并计算结束地址。

la   $t0 array
addi $t1 $t0 396 #last element of array

然后在循环体中:

lw  $t2 0($t0)
lw  $t3 0($t1)
sw  $t2 0($t1)
sw  $t3 0($t0)

addi $t0 $t0 4 
addi $t1 $t1 -4
blt  $t0 $t1 loop
于 2013-07-22T12:49:59.813 回答