Apostila simplificada do QtSPIM Introdução O QtSPIM é um simulador que executa programas de computadores RISC (Conjunto de Instruções 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 (faça 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 comentários iniciam com a cerquilha (#). Tudo à partir desse sinal até o fim da linha são ignorados. Os identificadores (assim como variáveis em outros programas) devem ser uma sequência de caracteres, underline ( _ ) e pontos ( . ) e não podem iniciar com um número. Rótulos podem ser declarados colocando-os no início 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 são: – \n → quebra de linha (Enter); – \t → tabulação (TAB); – \" → aspas duplas. Obs.: Utilize somente caracteres sem acento. O código de seu programa deve ser organizado em seções, onde deve-se escrever a diretiva necessária e depois seu código: .data → abriga os itens que devem ser armazenados no segmento de dados. .text → abriga as instruções que deverão ser executadas no seu programa. Para facilitar a programação, existem as seguintes diretivas, que podem ser armazenadas após ".data" e antes de ".text": .ascii "str" → Armazena a string "str" na memória, sem terminá-la com "\0" (NULL) .asciiz "str" → Armazena a string "str\0" na memória, terminando-a com "\0" (NULL) .byte 1, 2, ..., N → Armazena os N valores sucessivos (1,2,...,N) de bytes na memória .globl sym → Declara sym como global, permitindo-o ser utilizado por outros arquivos (também pode ser utilizada após a diretiva ".text") .spcace n → Armazena n bytes de espaço neste segmento de memória .word 1, 2, ..., N → Armazena as N palavras (1,2,...,N) sucessivamente na memória (também pode ser utilizada após a diretiva ".text") Além disso, seu programa pode fazer chamadas de sistema. Para utilizá-las, deve-se definir o número da chamada dentro de "$v0" e inserir seus argumentos ou obter seus resultados à partir de um padrão. Os principais são apresentados na tabela abaixo: Serviço Código da chamada Argumentos Imprimir inteiro 1 $a0 = inteiro Imprimir string 4 $a0 = endereço da string Ler inteiro 5 Ler string 8 exit 10 Retorno Inteiro dentro de $v0 $a0 = onde será salva $a1 = tamanho a ler Exemplo: imprimir na tela. As principais instruções a serem utilizadas no simulador são (O Src pode ser um registrador ou um imediato: inteiro de 16 bits): li Registrador, Inteiro # define o Registrador igual ao inteiro la Registrador, rótulo # define o Registrador com o valor do endereço do rótulo 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, Rótulo # Salta para o endereço de Rótulo se (Reg == Src) bne Reg, Src, Rótulo # Salta para o endereço de Rótulo se (Reg != Src) jr Reg jal Rótulo # Salta incondicionalmente para a instrução do endereço de Rótulo jalr Reg # Salta incondicionalmente para a instrução do endereço de Rótulo # Salta incondicionalmente p/ a instrução do endereço dentro de Reg Obs.: jal e jalr salvam em $ra o valor do endereço da instrução de retorno Mais um exemplo: fazer um laço de 1 à 100, imprimindo os números na tela Mais exemplos na próxima apostila. Abraços