Introdução a linguagem assembly MIPS
Como já foi visto anteriormente, nos Microcontrolador MIPS existem 32 registradores e para referenciar um registrador é necessário utilizar o caractere $
antes no nome dele.
Por exemplo para suponha que o nome do registrador seja v0
, logo para referenciar ele no código basta escrever $v0
.
As operações de leitura e escrita de dados são feitas a partir da especificação de um código de serviço (e cada um é responsável por uma chamada de sistema específica) que deve ser informado para o registrador $v0
. Após informar o código de serviço, ele é interpretado pela unidade controladora da CPU e então executar a instrução solicitada no hardware.
A seguir será descrito o processo de codificação e execução de um programa.
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
}
Este código é compilado para um executável binário.
0100010001110110
Após gerar o binário, o sistema operacional pega essas informações e então faz o alocamento de memória para a execução do programa. O sistema operacional aloca:
- Segmento de pilha (Stack)
- Segmento de dados: armazena as variáveis
- Segmento de texto: armazena as instruções
- Heap
O exemplo abaixo mostra um código, em Assembly, imprimindo Hello World
no terminal.
.data
# Definição da variável do tipo string com o caractere nulo
hello: .asciiz "Hello World!"
.text
# Exibir o valor da variável na tela do terminal
# Carregar um valor imediato (4, código de serviço de print de string) para o registrador v0
li $v0, 4
# Carregar o endereço de uma variável declarada no segmento de dados
la $a0, hello
syscall
Para compilar o código Assembly com o Simulador MARS, basta clicar no ícone de ferramenta:
Em seguida clicar no ícone de “play”:
E então será exibido a saída do programa na aba Run I/O
:
Observação
É uma boa prática no final do código indicar que o programa executou com sucesso. Para isso é repassado o código de serviço
10
(exit) para o registrador$v0
e então fazer a chamada de sistema (syscall
).