Apostila simplificada do QtSPIM
Introduo
O QtSPIM um simulador que executa programas de computadores RISC (Conjunto de Instrues
Reduzido) MIPS R2000/3000. Ele pode carregar e executar arquivos contendo a linguagem
assembly dessa arquitetura.
Voc pode obter esse simulador em:
Para Windows: http://repo.jeiks.net/QtSpim.zip
Para Linux (faa tudo como root:
adicione em /etc/apt/sources.list a linha:
deb http://repo.jeiks.net jeiks main
e execute os comandos:
apt-get update
apt-get install qtspim
Sobre a sintaxe Assembly
Os comentrios iniciam com a cerquilha (#). Tudo partir desse sinal at o fim da linha so
ignorados.
Os identificadores (assim como variveis em outros programas) devem ser uma sequncia de
caracteres, underline ( _ ) e pontos ( . ) e no podem iniciar com um nmero.
Rtulos podem ser declarados colocando-os no incio da linha seguidos do sinal de dois pontos ( : ).
As strings devem ser escritas dentro de aspas duplas ( " )
Os caracteres especiais que podem ser utilizados dentro de strings so:
\n quebra de linha (Enter);
\t tabulao (TAB);
\" aspas duplas.
Obs.: Utilize somente caracteres sem acento.
O cdigo de seu programa deve ser organizado em sees, onde deve-se escrever a diretiva
necessria e depois seu cdigo:
.data
abriga os itens que devem ser armazenados no segmento de dados.
.text
abriga as instrues que devero ser executadas no seu programa.
Para facilitar a programao, existem as seguintes diretivas, que podem ser armazenadas aps
".data" e antes de ".text":
.ascii "str"
Armazena a string "str" na memria, sem termin-la com "\0" (NULL)
.asciiz "str"
Armazena a string "str\0" na memria, terminando-a com "\0" (NULL)
.byte 1, 2, ..., N
Armazena os N valores sucessivos (1,2,...,N) de bytes na memria
.globl sym
Declara sym como global, permitindo-o ser utilizado por outros arquivos
(tambm pode ser utilizada aps a diretiva ".text")
.spcace n
Armazena n bytes de espao neste segmento de memria
.word 1, 2, ..., N
Armazena as N palavras (1,2,...,N) sucessivamente na memria
(tambm pode ser utilizada aps a diretiva ".text")
Alm disso, seu programa pode fazer chamadas de sistema. Para utiliz-las, deve-se definir o
nmero da chamada dentro de "$v0" e inserir seus argumentos ou obter seus resultados partir de
um padro. Os principais so apresentados na tabela abaixo:
Servio
Cdigo da chamada
Argumentos
Imprimir inteiro
$a0 = inteiro
Imprimir string
$a0 = endereo da string
Ler inteiro
Ler string
exit
10
Retorno
Inteiro dentro de $v0
$a0 = onde ser salva
$a1 = tamanho a ler
Exemplo: imprimir na tela.
As principais instrues a serem utilizadas no simulador so (O Src pode ser um registrador ou um
imediato: inteiro de 16 bits):
li Registrador, Inteiro # define o Registrador igual ao inteiro
la Registrador, rtulo # define o Registrador com o valor do endereo do rtulo
syscall
# faz a chamada de sistema
add
# Define Rdest igual (Reg - Src)
Rdest, Reg, Src
addi Rdest, Reg, Imed
# Define Rdest igual (Reg - Imediato)
sub
Rdest, Reg, Src
# Define Rdest igual (Reg - Src)
slt
Rdest, Reg, Src
# Define Rdest igual 1 se (Reg < Src)
slti Rdest, Reg, Imed
# Define Rdest igual 1 se (Reg < Imediato)
beq
Reg, Src, Rtulo
# Salta para o endereo de Rtulo se (Reg == Src)
bne
Reg, Src, Rtulo
# Salta para o endereo de Rtulo se (Reg != Src)
jr
Reg
jal
Rtulo # Salta incondicionalmente para a instruo do endereo de Rtulo
jalr Reg
# Salta incondicionalmente para a instruo do endereo de Rtulo
# Salta incondicionalmente p/ a instruo do endereo dentro de Reg
Obs.: jal e jalr salvam em $ra o valor do endereo da instruo de retorno
Mais um exemplo: fazer um lao de 1 100, imprimindo os nmeros na tela
Mais exemplos na prxima apostila.
Abraos