assembly - MIPS 程序集 (MARS) 中的 .align 指令
问题描述
我正在为我的大学做一个项目,在名为 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
。文本 .globl 主要
主要的: la $a0,味精1
李 $v0, 4 系统调用 # 打印字符串标题### 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
我做错了什么?如果有人可以向我解释,我将不胜感激。先感谢您。
解决方案
在这一行中,
mul $t0, $s4, 4 # $t0 <- index
您已经将索引乘以应该是元素的大小,以便从数组的开头获得偏移量。
但是,双精度是 8 个字节,所以索引应该乘以 8(相当于左移 3)。这与其他数组的偏移量计算不匹配 - 通常,您不能重复使用这样的缩放索引。
推荐阅读
- angular - 在 ng2 chart.js 中删除 DoughtChart 上的百分比
- sql - 无法仅为一项作业打开步骤输出文件
- python - 由于 2.7 deprecation 错误,已安装 Python 3 并且无法安装 MySQLdb
- c++ - 如何分离while循环?
- reactjs - 类构造函数类型扩展另一个并同时相交
- entity-framework-core - EF Core 2.2 - 无法添加新记录并链接到已经存在的另一条记录
- jquery - 多词自动完成过滤
- javascript - React 过多地使用垃圾收集器并减慢我的应用程序
- webpack - katex 作为 webpack 外部加载
- sql - SQL:选择所有具有最大值和 WHERE 条件的行