Я получаю сообщение об ошибке MIPS «spim: (parser) синтаксическая ошибка» при запуске кода

Вот мой код:

    .data
num1:   .word   # num1 variable
num2:   .word   # num2 variable
max:    .word   # max variable
msg:    .asciiz "Enter an integer " # msg
msg2:   .asciiz "The bigger value is " # msg2
    .text
main:
   la   $a0, msg   # prints msg
   li    $v0, 4
   syscall
   la   $v0, 5       # reads data
   syscall
   # loads address of num1 to $t0
   la $t0, num1
   # moves the content of $v0 to $t0
   move $t0,$v0
   la   $a0, msg   # print msg
   li    $v0, 4
   syscall
   la   $v0, 5       # read data
   syscall
   # loads address of num1 to $t1
   la $t1, num2
   # moves the content of $v0 to $t1
   move $t1,$v0
   # loads address of max to t2
   la $t2, max
   # if $t0 (num1) > $t2 (num2), execute if part/label
   bgt $t0,$t1,if   # go to if label
   # else
   else:
   # moves the contents of $t1 (num2) to $t2 (max)
   move $t2,$t1
   la   $a0, msg2   # print msg2
   li    $v0, 4
   syscall
   move   $a0, $t2   # print max
   li   $v0, 1
   syscall
   li   $v0, 10       # exit
   syscall
   # if
   if:
   # moves contents of $t0 (num1) to $t2 (max)
   move $t2,$t0
   la   $a0, msg2   # print msg2
   li    $v0, 4
   syscall
   move   $a0, $t2   # print max
   li   $v0, 1
   syscall
   li   $v0, 10       # exit
   syscall

Каждый раз, когда я пытаюсь запустить этот код в QTSpim, я получаю ошибку spim: (parser) синтаксическая ошибка в строке 3 файла C:/Users/danie/Desktop/program_1.asm .word # переменная num1

Что я делаю неправильно? Спасибо


person ItsDanielle    schedule 19.03.2021    source источник
comment
Предоставьте инициализатор для вашего слова. Например. .word 0.   -  person Jester    schedule 19.03.2021
comment
.word без аргументов (если бы он собирался) зарезервировал бы 0 байтов пространства для пустого списка инициализаторов слов. Как uint32_t array[0] = {}; в C. В любом случае это явно не то, что вы хотели, так что хорошо, что ассемблер не дает вам написать что-то бесполезное.   -  person Peter Cordes    schedule 19.03.2021


Ответы (1)


Вы хотите, чтобы .word 0 выдал одно 32-битное слово со значением 0.

.word без операндов зарезервирует 0 байтов пространства для этого пустого списка инициализаторов слов. (Вот как некоторые другие ассемблеры на самом деле обрабатывают это, а не ошибаются.) Так что это похоже на uint32_t array[] = {}; в C1, как объявление массива из 0 элементов.

Это не то, что кому-то нужно (нормальный человек просто полностью исключил бы .word, если бы он просто хотел поставить несколько меток на один и тот же адрес), поэтому кажется, что ассемблер SPIM не дает вам написать что-то бесполезное и рассматривает это как ошибку. Я предполагаю, что вы можете представить макрос, который для некоторых конфигураций расширяется до нуля, и, возможно, поэтому другие ассемблеры предпочитают не ошибаться и рассматривать .word как список из нуля или более значений слов вместо одного или нескольких.

Сноска 1: За исключением C, два массива не могут иметь один и тот же адрес, даже если они пусты, или, по крайней мере, GCC избегает этого. GCC на самом деле создает некоторые отступы после пустого массива: https://godbolt.org/z/5GMT6e

person Peter Cordes    schedule 19.03.2021