1. ホーム
  2. assembly

[解決済み] アセンブリMIPS。配列の初期化および合計

2022-02-17 12:31:36

質問内容

例えば、10個の数値の配列があり、それらの数値を合計してこのような変数にしたいとします。

int arr[10]= {1, 15, 0, -3, 99, 48, -17, -9, 20, 15};

sum = 0;

for(i=0; i<10; i++)

   sum = sum + arr[i];

これを "assembly mips" しようとすると、ある行が消えてしまいます。

.data
arr: .word 1, 12, 0, -3, 99, 48, -17, -9, 20, 15

.text
.globl main
main:

add $t0, $zero, $zero   #counter i
add $t1, $zero, $zero   #sum

la  $t2, arr      #loading the address of the array to a register

loop:
slti    $t3, $t0, 10        #i<10
beq $t3, $zero, EXIT

add $t1, $t1, $t2($t0)     #wrong wrong very wrong

addi    $t0, $t0, 1        #i++
j loop
EXIT:

li  $v0, 10
syscall

アセンブリへのポイント "arr[i]" をどのように表現するのかが理解できません。

どのような表現が正しいのでしょうか?

配列の番号ごとに別のレジストリを取らなければならないのでしょうか?

どのように解決するのですか?

上からのJesterさんのおかげで、正しいコードは以下の通りです。

.data
arr: .word 1, 12, 0, -3, 99, 48, -17, -9, 20, 15

.text
.globl main
main:

add $t0, $zero, $zero   #counter i
add $t1, $zero, $zero   #sum

la  $t2, arr

loop:
slti    $t3, $t0, 10        #i<10
beq $t3, $zero, EXIT

lw  $t4, ($t2)  #$t4 = arr[i]
addi    $t2, $t2, 4

add $t1, $t1, $t4   #sum = sum + arr[i]

addi    $t0, $t0, 1 #i++
j loop
EXIT:

add $a0, $zero, $t1     #moving the sum to $a0 register for printing

li  $v0, 1
syscall

li  $v0, 10
syscall