【发布时间】:2018-12-13 01:53:57
【问题描述】:
我正在为我的大学做一个项目,在名为 MARS 的程序上使用 MIPS 程序集。 我在使用 .align 时遇到了一些问题。我想我完全不明白这个指令是如何工作的。
这是 MARS 给我的错误示例:“0x00400098 处的运行时异常:地址未在双字边界 0x1001017c 上对齐”。
当我尝试从名为 'v' 的双精度数组中加载双精度时发生错误:
l.d $f12, ($t1)
这是我的代码:
。数据 msg1: .asciiz "### SETTE E MEZZO ###\n\n" msg2: .asciiz "carta estratta:"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
.text .globl 主要
主要:
la $a0, msg1
李 $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) #modifico lo 堆栈指针在 modo che punti alla prima parola del record di attivazione 添加 $fp, $sp, 16 #------ 日航随机 move $s4, $v0 # numero Casuale in $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
随机:
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
我做错了什么? 如果有人可以向我解释,我将不胜感激。 提前谢谢你。
【问题讨论】:
-
为了获得正确的初始对齐,
.align应该放在标签之前。否则,标签可能位于(例如)地址 0x01,但数据位于地址 0x02(即间隙)。而且,有些需要 more 对齐。所以,做:.align 4 A:/.align 0 s:/.align 8 v:
标签: assembly alignment mips memory-alignment mars-simulator