c - 在 MIPS 程序集中交换数组中的元素? (比较清楚的)

标签 c arrays assembly mips swap

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

这是我想转换为 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。显然我做错了什么。 我只需要它通过交换返回 0 到 63(十六进制)或 0 到 99(十进制)。有什么提示吗?

最佳答案

好吧,您关于需要两个数组的说法是错误的,但正是您得出了这样的结论。请记住,任何可以用 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

关于c - 在 MIPS 程序集中交换数组中的元素? (比较清楚的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17785863/

相关文章:

在 c 中给出意外输出的代码

c - 未赋值的变量有值

php - 如何用它的值替换数组键

javascript - Highchart pie - 动态饼图的数组动态

python - 对六个随机数施加约束,使三个负数和三个正数等于 1?

c - 需要帮助在 C 代码中编写汇编语言

linux - x86 程序集,没有遵循小字节序(或者是?)(Linux)

c - llvm:如何生成避免基于 RIP 的寻址模式的 x64 代码?

c - 为二维数组动态分配空间

c - 在同一个进程中,同一个文件的多个 MAP_PRIVATE 映射仍然是私有(private)的吗?