Странное поведение адреса MIPS - PullRequest
0 голосов
/ 03 октября 2019

Я новичок в MIPS и все еще скребу некоторые основные команды, в настоящее время я столкнулся с очень странной ситуацией, когда у меня есть 2 идентичных кода, но один выполняется, а другой нет.

Это код, которыйвыдает исключение при работе в строке sw $v0, input:

.data

Text_output1: .asciiz "Input number 1: "
input: .word

.text
main:
li $v0, 4
la $a0, Text_output1
syscall

li $v0, 5
syscall

sw $v0, input
li $v0, 1
lw $a0, input
add $a0, $a0, 1
syscall

Это нормальное функционирование:

# Program: Hello, World!
.data

# data declaration section; specifies values to be stored
# in memory and labels whereby the values are accessed

Greeting: .asciiz "\nghfhgfhgf\n"
Text_output1: .asciiz "Number 1 : "
input: .word

.text # Start of code section
main: # Execution begins at label "main"
li $v0, 4 #in ra number 1 :
la $a0, Text_output1
syscall

li $v0, 5
syscall

sw $v0, input
li $v0, 1
lw $a0, input
add $a0, $a0, 1
syscall

Я не вижу никакой разницы между двумя или есть что-то, что яНе знаете об этом языке?

Кстати, я использую MARS 4.5 с JDK 13. Большое спасибо.

1 Ответ

1 голос
/ 04 октября 2019

Если вы пишете какую-либо сборку MIPS, вы должны получить официальную ссылку на набор инструкций ( Архитектура MIPS32 ™ для программистов, том II: Набор инструкций MIPS32 ™ ).

Дляsw инструкция гласит следующее:

Ограничения:
Эффективный адрес должен быть естественно выровнен. Если один из 2 младших значащих битов адреса не равен нулю, возникает исключение Address Error.

Как ясно показывает симулятор, у вас есть инструкция sw по адресу 0x0040001cон пытается записать на адрес 0x10010011, который не является выровненным по словам адресом.

Ваш второй пример не работает, потому что две строки занимают 24 байта памяти, поэтому input метка заканчивается на 24 байта от начала раздела .data, который является адресом с выравниванием по словам.

Чтобы обеспечить правильное выравнивание, используйте директиву .align, например:

.align 2
input: .word 0

Также обратите внимание на 0 после .word. Если вы пропустите начальное значение и просто напишите .word, у вас возникнут проблемы, если вы добавите больше переменных (все они получат один и тот же адрес).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...