Директива .align в сборке MIPS (MARS) - PullRequest
0 голосов
/ 04 июля 2018

Я делаю проект для своего университета, используя сборку MIPS по программе MARS. У меня есть некоторые вопросы по работе с .align. Я думаю, что совсем не понимаю, как работает эта директива.

Это пример ошибки, которую мне дает MARS: «Исключение во время выполнения по адресу 0x00400098: адрес не выровнен по границе двойного слова 0x1001017c».

Ошибка возникает, когда я пытаюсь загрузить double из массива double с именем 'v': l.d $f12, ($t1)

Это мой код:

.data
    msg1: .asciiz "### SETTE E MEZZO ###\n\n"
    msg2: .asciiz "carta estratta: "</p>

<pre><code>A:
.align 2
 .word 1,2,3,4,5,6,7,8,9,10,    1,2,3,4,5,6,7,8,9,10,  1,2,3,4,5,6,7,8,9,10,  1,2,3,4,5,6,7,8,9,10 
s:
.align 0
 .byte 'c','c','c','c','c','c','c','c','c','c','q','q','q','q','q','q','q','q','q','q','f','f','f','f','f','f','f','f','f','f','p','p','p','p','p','p','p','p','p','p'

v:
.align 3
.double 1,2,3,4,5,6,7,0.5,0.5,0.5,  1,2,3,4,5,6,7,0.5,0.5,0.5,  1,2,3,4,5,6,7,0.5,0.5,0.5,  1,2,3,4,5,6,7,0.5,0.5,0.5
</code>

.text .globl main

основной: la $ a0, msg1
li $ v0, 4 syscall # print stringa titolo

 ### SALVO GLI INDIRIZZI DEGLI ARRAY IN REGISTRI ###
la $s0, A       # $s0 <- &A (indirizzo array numero carte)
la $s1, s       # $s1 <- &s (indirizzo array semi carte)
la $s2, v       # $s2 <- &v (indirizzo array valori carte)

li $s3, 0       # $s3 <- somma carte PLAYER 

jal Player



li $v0, 10      #exit
syscall

Игрок: #ОТ СЕБЯ subu $ sp, $ sp, 24 #abbasso lo Указатель стека di 20 perchè devo salvarmi 5 registri ciascuno da 4 байта (quindi 5 * 4 = 20 байт) sw $ fp, 20 ($ sp) sw $ ra, 16 ($ sp) sw $ s0, 12 ($ sp) sw $ s1, 8 ($ sp) sw $ s2, 4 ($ sp) sw $ s3, 0 ($ sp) # изменяет указатель стека в режиме че пунти алла прима парола дель запись аттивазионе addiu $ fp, $ sp, 16 # ------------------ случайный случай переместить $ s4, $ v0 # Numberro casuale в $ s4

mul $t0, $s4, 4     # $t0 <- index
add $t1, $s0, $t0   # $t1 <- &A[index]
lw $a0, 0($t1)      #vado a prendere nell'array A una carta a caso in base al numero random che funge da incdice        
li $v0, 1   
syscall         # print del numero della carta
sw $zero, 0($t1)    # A[index] <- 0    in modo che non venga estratto due volte lo stesso numero

add $t1, $s1, $s4   # $t1 <- &s[index]
lb $a0, 0($t1)      #vado a prendere nell'array s il seme
li $v0, 11
syscall 

add $t1, $s2, $t0   # $t1 <- &v[index]  
l.d $f12, ($t1)
li $v0, 3

#POP
lw $s3, 0($sp)
lw $s2, 4($sp)
lw $s1, 8($sp)
lw $s0, 12($sp)
lw $ra, 16($sp)
lw $fp, 20($sp)
addi $sp, $sp, 20
#------------------

jr $ra

Random:

li $v0, 42 li $a1, 40 syscall # estrae pseudo-random number da 0 a 9 move $v0, $a0 # numero casuale in $v0 (VALORE DI RITORNO) jr $ra

Что я делаю не так? Я был бы очень признателен, если бы кто-то мог мне это объяснить. Заранее спасибо.

1 Ответ

0 голосов
/ 04 июля 2018

В этой строке

mul $t0, $s4, 4     # $t0 <- index

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

Однако значение типа double равно 8 байтам, поэтому индекс нужно было умножить на 8 (эквивалентно, сместить влево на 3). Это не соответствует вычислению смещения для других массивов - как правило, вы не можете использовать масштабированный индекс подобным образом.

...