Programação em Assembly MIPS no QtSpim

Lara Teixeira Oliveira

você vai aprender

Como fazer um programa em Assembly MIPS para o QtSpim

Como simular o programa no QtSpim

pré-requisitos

Programação Básica em Assembly

Download do QtSpim(Simulador de MIPS)

exercício proposto

O objetivo deste tutorial é ensinar a programar em Assembly MIPS para o simulador de assembly QtSpim. Dessa forma, vamos propor o seguinte código em C#

static void Main(string[] args) 
{             
  int numero, sucessor;

  Console.WriteLine("Digite um numero");

  numero = int.Parse(Console.ReadLine());

  sucessor = num + 1;

  Console.Write(sucessor);
}
		


Como podemos ver, o programa apenas recebe um número de entrada e imprime na tela seu sucessor. Vamos fazer então, passo a passo, o programa em assembly.

fragmento de código widget

passo 1: int numero, sucessor

Abra um editor de texto de sua preferência, pois o QtSpim é apenas um simulador de assembly, e vamos começar.

Sabemos que no assembly não é necessário declarar variáveis. Mas podemos passar alguns dados para que o QtSpim utilize-os no programa. Nesse caso, vamos alocar na memória dois endereços, um para 'numero' e um para 'sucessor', e vamos passar a string "Digite um numero" para ser impressa.

.data

mensagem: 	.asciiz "Digite um numero\n"
numero: 	.word 1
sucessor: 	.word 1
		


O '.data' representa a parte do programa onde estarão os dados a serem utilizados pelo QtSpim. É como se fosse uma declaração de variáveis, onde a variável 'mensagem' contém a string "Digite um numero\n", a variavel 'numero' contém o inteiro "1" e a variável sucessor contém o inteiro "1". O '.word' e o '.asciiz' são os tipos das variáveis, sendo '.word' para inteiros e '.asciiz' para strings no formato ASCII.

passo 2: Console.WriteLine("Digite um numero")

A tarefa agora é imprimir a mensagem "Digite um numero" no console.

.text

main:	li $v0, 4
		la $a0, mensagem
		syscall


O '.text' representa a parte do programa onde estará o código a ser executado. O 'main' funciona como um identificador para o bloco ser chamado nas funções de pulo. O comando 'li' significa "Load Immediate", e é utilizado nesse caso para passar uma instrução ao syscall pelo registrador $v0. Cada instrução tem um código específico, e o código '4' se refere a imprimir uma string no console. O comando 'la' significa "Load Adress" e está passando para o registrador argumento '$a0', o endereço de memória onde está armazenado a 'mensagem'. Quando chamamos o 'syscall' ele interpreta que é para imprimir uma mensagem no console e recebe como argumento a 'mensagem'.

fragmento de código widget

passo 3: numero = int.Parse(Console.ReadLine())

A tarefa agora é receber do usuário um número inteiro digitado no teclado.

li $v0, 5 
syscall

sw $v0, numero
		

Usamos o comando 'li' mais uma vez para passar a instrução para o 'syscall'. O código '5' se refere à leitura de um inteiro. Chamamos o 'syscall' para executar a leitura e logo depois usamos o 'sw', que significa "Store Word", para armazenar o valor lido no teclado na posição da memória onde declaramos o nosso 'numero'.

passo 4: sucessor = num + 1;

A tarefa agora é calcular o sucessor do número lido.

addi $t0, $v0, 1

sw $t0, sucessor

Incrementamos então o número recebido em 1, armazenamos em $t0 e vamos salvá-lo na posição da memória onde declaramos o nosso 'sucessor'

passo 5: Console.Write(sucessor)

A tarefa agora é imprimir o nosso resultado.

li $v0, 1
move $a0, $t0
syscall

jr $ra
		

Usamos o comando 'li' mais uma vez para passar a instrução para o 'syscall'. O código '1' se refere à impressão de um inteiro no console. Usamos o comando 'move' para mover o valor de $t0(sucessor) para o registrador argumento $a0. Quando chamamos o 'syscall', ele interpreta que deve imprimir um inteiro no console e recebe como argumento o sucessor calculado($t0). Para finalizarmos o programa usamos 'jr $ra'.

O programa final então fica:

            .data

mensagem:	.asciiz "Digite um numero\n"
numero: 	.word 1
sucessor: 	.word 1
		
	.text
	# imprime mensagem
main:	li $v0, 4 
	la $a0, mensagem
	syscall

	# lê inteiro
	li $v0, 5 
	syscall
			
	# grava numero na memória	
	sw $v0, numero
			
	# calcular sucessor
	addi $t0, $v0, 1

	# grava sucessor
	sw $t0, sucessor
			
	# imprime inteiro
	li $v0, 1
	move $a0, $t0
	syscall

	jr $ra
	

Podemos usar '#' para comentários. Para salvar o programa, salve o arquivo no modo sem extensão, e adicione um '.s' ao final do nome do arquivo. E vamos para a simulação.

simulação no QtSpim

Ao instalar o QtSpim e executá-lo, temos a tela inicial.


Imagem 1

Para entender um pouco melhor o que temos na tela, acesse o tutorial indicado nos links úteis.

Para executar o nosso programa, clique em "Load File"


2


Selecione o seu programa no diretório onde ele foi salvo.

3


Podemos notar que foi adicionado algumas linhas de código na tela adicional. Isso é o QtSpim transformando o código criado em linguagem Pure Assembly para a simulação. Agora é só clicar no "Run/Continue" para executar o nosso programa.

4


Temos então no Console, o nosso programa funcionando.

5


Imagem 1 Imagem widget

links úties

Voltar