Sintaxe da linguagem assembly MIPS
Considere o código abaixo para as explicações contidas neste documento.
.data
N1: .asciiz "Digite o 1o numero: "
N2: .asciiz "Digite o 2o numero: "
MsgSoma: .asciiz "\nSoma = "
MsgSub: .asciiz "\nSubtracao = "
MsgMul: .asciiz "\nMultiplicacao = "
.text
li $v0,4
la $a0,N1
syscall
li $v0,5
syscall
move $t0, $v0
li $v0,4
la $a0,N2
syscall
li $v0,5
syscall
move $t1, $v0
add $t2, $t0, $t1
li $v0,4
la $a0,MsgSoma
syscall
li $v0,1
move $a0, $t2
syscall
sub $t2, $t0, $t1
li $v0,4
la $a0,MsgSub
syscall
li $v0,1
move $a0, $t2
syscall
mul $t2, $t0, $t1
li $v0,4
la $a0,MsgMul
syscall
li $v0,1
move $a0, $t2
syscall
li $v0, 10
syscall
Todo código escrito com a linguagem assembly MIPS contém duas diretivas base, sendo elas:
-
.data
: indica o início do segmento de dados, onde as variáveis são declaradas. -
.text
: indica o início do segmento de texto, onde as instruções do programa são definidas.
Além disso, existem as instruções que descrevem o programa:
-
li $v0, 4
: Esta instrução carrega o valor 4 no registrador$v0
. No contexto das chamadas do sistema, o valor em$v0
especifica o serviço a ser solicitado. Neste caso, o valor 4 indica a impressão de uma string. -
la $a0, N1
: Esta instrução carrega o endereço da stringN1
no registrador$a0
. O registrador$a0
é frequentemente usado para passar argumentos parasyscall
. -
syscall
: Esta instrução faz uma chamada ao sistema para executar a ação desejada, com base nos valores nos registradores$v0
e$a0
. -
li $v0, 5
: Esta instrução carrega o valor 5 no registrador$v0
, indicando que desejamos ler um inteiro do teclado. -
move $t0, $v0
: Esta instrução copia o valor do registrador$v0
para o registrador$t0
. O registrador$v0
contém o valor lido do teclado após asyscall
de leitura. -
add $t2, $t0, $t1
: Esta instrução adiciona os valores nos registradores$t0
e$t1
e armazena o resultado em$t2
. -
sub $t2, $t0, $t1
: Esta instrução subtrai o valor no registrador$t1
do valor no registrador$t0
(t0} - \text{$t1} t2`. -
mul $t2, $t0, $t1
: Esta instrução multiplica os valores nos registradores$t0
e$t1
e armazena o resultado em$t2
. -
li $v0, 1
: Esta instrução carrega o valor 1 no registrador$v0
, indicando que desejamos imprimir um inteiro. -
move $a0, $t2
: Esta instrução move o valor do registrador$t2
para o registrador$a0
, que será usado como argumento nasyscall
de impressão. -
li $v0, 10
: Esta instrução carrega o valor 10 no registrador$v0
, indicando que desejamos encerrar o programa.