2013-09-20 2 views
3

Когда я загружаю переменную с использованием 4-байтового смещения, как мне загрузить эту переменную в массив?Смещения MIPS с переменными

Например ... если у меня есть оператор присваивания C:

B[8] = A[i] + A[j] 

lw $t0, 4j($s6) # load A[j] into $t0 
lw $ti, 4i($s6) # load A[i] into $t1 
add $t0, $t0, $t1 # Register $t0 gets A[i] + A[j] 
sw $t0, 32($s7) # Stores A[i] + A[j] into B[8] 

Будет ли это правильный способ сделать смещение для переменной? 4j и 4i часть, где я действительно запутался.

Edit: я и J имеют регистры $ s3 и s4 $, но я не знаю, как использовать

+0

Собирается ли это? Я никогда не видел этот синтаксис для использования смещения переменной. –

+0

Он не собирается, я не могу понять, как собрать заявление. Я отредактировал, добавив дополнительную информацию. – CloudN9ne

ответ

4

Вы довольно близко, вам просто нужно рассчитать корректоры:

li $s2, 4   # put constant 4 in s2 
multu $s2, $s3 # multiply s3 by 4 
mflo $s3   # put multiplication result back in s3 
multu $s2, $s4 # multiply s4 by 4 
mflo $s4   # put multiplication result back in s4 
add $s4, $s6, $s4 # s4 = pointer to A[j] 
add $s3, $s6, $s3 # s3 = pointer to A[i] 
lw $t0, ($s4)  # load A[j] into t0 
lw $t1, ($s3)  # load A[i] into t1 
add $t0, $t0, $t1 # t0 = A[j] + A[i] 
sw $t0, 32($s7) # B[8] = A[i] + A[j] 
0

Я не думаю, что это правильно, на языке ASM у вас нет «переменных», вы должны получить доступ к регистру, который содержит i и j, у вас нормальный указатель на базовый массив, который, кажется, равен $ s6, и ваши смещения отсутствуют, и он не рассчитан правильно, что вы используете временный регистр для вычисления суммы $ t2, $ base, $ offset, каждый в своем собственном регистре, а затем использовать (что означает 4i - номер, который i s 4 * i, а 4j - число, которое равно 4 * j, но не может быть введено напрямую, как и переменные, и содержится с регистром) lw $ ti, $ t2

Посмотрите, что я имею в виду? Этот asm предполагает, что вы делаете умножения i и j как 4 * i и 4 * j как смещение, но смещение не может быть регистром, поэтому вы добавляете 4 байта, предполагая, что каждый элемент массива имеет размер 4 байта. предполагая, что результат 4 * я и 4 * J в $ t4 и t5 $ соответственно:

add $t1, $s6, $t4 
lw $t2, $t1 
add $t1, $s6, $t5 
lw $t3, $t1 
add $t0, $t2, $t3 
sw $t0, 32($s7) 
1

предположить $ s0 магазинов я и $ s1 магазины J. Базовый адрес A & B - $ s6, $ s7 соответственно

sll $t0,$s0,2 #offsets 4*i 
sll $t1,$s1,2 #offsets 4*j 
add $t0,$t0,$s6 #Pointer to A[i] 
add $t1,$t1,$s6 #Pointer to A[j] 
lw $t0, 0($t0) #loads A[i] to $t0 
lw $t1, 0($t1) #loads A[j] to $t1 

add $t2,$t1,$t0 #A[i]+A[j] 

sw $t2, 32($s7) #stores A[i]+A[j] to B[8] 
Смежные вопросы