valores de passagem nas macros MIPS

Estive a estudar MIPS como introdução à montagem e comecei recentemente a tocar com macros. O que eu quero ser capaz de fazer é passar um valor gerado por outra macro, ou apenas qualquer valor em qualquer registro particular, para outra macro. ie,

.data

.macro print_int(%x) #this macro prints a given integer %x
li      $v0, 1
li      $a0, %x
syscall
.end_macro

.macro terminate     #this macro terminates a program
li      $v0, 10
syscall
.end_macro

.text
main:

li      $t0, 7       #first, load the value 7 into register t0
print_int($t0)       #then, attempt to pass the value in $t0 through print_int

terminate            #end program

Este programa (especificamente a linha print_int($t0)) não passa pelo montador e aparece como um erro. Existe uma maneira sintática adequada de fazer isso, ou minha abordagem é fundamentalmente incorreta?

Author: user3715913, 2014-06-08

1 answers

Nunca é tarde demais para corrigir um erro! Tens muitos erros. Em primeiro lugar, você não pode chamar li com um valor de registro como um segundo parâmetro. Então, deve usar $x e não %x. Finalmente, as macros estão dentro da secção .text (ver MIPS). (Note também, que macros não são suportados pelo QtSpim. No entanto, eles são suportados por Marte.)
.text

.macro print_int($x)
#lw $a0, $x #alternative call
la $a0, ($x)
li $v0, 1
syscall
.end_macro

.macro terminate
li $v0,10
syscall
.end_macro

main:

li $t0, 7

print_int($t0) #call print macro!

terminate #end program
 0
Author: Pavlos Fragkiadoulakis, 2018-04-03 21:35:17