Ошибка: "адрес магазина не выровнен по границе слова"
Я использую симулятор MARS MIPS и симулятор Digital Lab.
Цель моего кода - показать цифры от 0 до 15 в шестнадцатеричном формате в Digital Lab Sim.
Я получаю эту ошибку
Runtime exception at 0x00400024: store address not aligned on word boundary 0xffff0011
Это код, который я использую:
.data
digitos: .word 0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x67,0x77,0x7F,0x39,0x3F,0x79,0x71
contador: .word 16
.text
main:
la $t0,0xFFFF0011
la $a0,contador
lw $t1,0($a0)
li $t9,0
la $t2, digitos
loop:
lw $t3,0($t2)
sw $t3, 0($t0)
addi $t9,$t9,1
addi $t2,$t2,4
blt $t9,$t1,loop
Инструкция la $t0,0xFFFF0011
несет ответственность за ошибку. 0xFFFF0011 контролирует левый светодиод, а 0xFFFF0010 контролирует правый светодиод.
Вот забавная часть. Если я использую 0xFFFF0010, код работает как положено, но если я использую 0xFFFF0011, он не работает.
Что я делаю неправильно?
1 ответ
Вы уверены, что ошибка происходит на этой линии? Я думаю, что ошибка на самом деле происходит здесь:
sw $t3, 0($t0)
Проблема в том, что вы пытаетесь сохранить слово (потому что вы используете sw
) по адресу, который не выровнен по словам. 0xFFFF0011 не выровнено по словам. Причина, по которой работает 0xFFFF0010, заключается в том, что он выровнен по словам.
Слово имеет длину 4 байта, поэтому действительные слова с выравниванием по словам: 0xFFFF0010, 0xFFFF0014, 0xFFFF0018 и т. Д. Все, что находится между ними, не выровнено по словам.
Вы должны быть в состоянии исправить это, изменив его с sw
в sb
:
sb $t3, 0($t0)
Это работает, потому что хранение байта не требует выровненного слова.
Редактировать: чтобы уточнить, выровненный по слову адрес делится на 4.