ここに同様の質問があることは知っています。私はそれをその質問の続きと考えたいのですが、より徹底しています。
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 ではすべて 16 進形式で示されます)、次に 31 から 1 へ、そして突然 63 から 47 へと順番に (正しくスワップして) 機能します。swapping を介して 0 から 63 (16 進数) または 0 から 99 (10 進数) を返すだけです。ヒントはありますか?