Я делаю проект для своего университета, используя сборку 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
Что я делаю не так?
Я был бы очень признателен, если бы кто-то мог мне это объяснить.
Заранее спасибо.