Получавам грешка MIPS „spim: (синтактична грешка) синтаксис“ при изпълнение на код

Ето моят код:

    .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