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 string N1 no registrador $a0. O registrador $a0 é frequentemente usado para passar argumentos para syscall.

  • 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 a syscall 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 (Missing close brace\text{\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 na syscall de impressão.

  • li $v0, 10: Esta instrução carrega o valor 10 no registrador $v0, indicando que desejamos encerrar o programa.

Referências