Fundamentos Assembly MIPS
1. Tipos de Linguagem de Programação
1.1 Linguagem de Máquina
- É o nível mais baixo, interpretado diretamente pelo processador.
- Usa apenas códigos binários (0 e 1), sem nenhuma abstração.
- Vantagens: rápido e eficiente, sem camadas extras.
- Desvantagens: muito difícil para humanos lerem/escreverem e específico para cada hardware.
Exemplo hipotético:
10110000 01100001
1.2 Linguagem de Montagem (Assembly)
- Representação simbólica da linguagem de máquina.
- Usa mnemônicos (
ADD
,SUB
,MOV
,LW
, etc.) no lugar de binário puro. - Cada instrução Assembly corresponde a 1 instrução de máquina.
- Depende do hardware → cada arquitetura (x86, MIPS, ARM) tem seu Assembly próprio.
- Necessita de um Assembler para traduzir para linguagem de máquina.
Exemplo MIPS:
Exemplo MIPS:
add $t0, $t1, $t2 # $t0 = $t1 + $t2
1.3 Linguagens de Alto Nível
- Mais próximas da linguagem humana, independentes do hardware.
- Ex: Python, C, Java, C++.
- Precisam de Compiladores ou Interpretadores para transformar o código em Assembly/Linguagem de máquina.
Diferença:
- Compilador (ex.: C): traduz o código inteiro para binário antes da execução.
- Interpretador (ex.: Python): traduz e executa linha por linha.
Exemplo em C:
int soma(int a, int b) {
return a + b;
}
2. Arquiteturas RISC x CISC
2.1 RISC (Reduced Instruction Set Computer)
- Poucas instruções, simples e rápidas.
- Cada instrução geralmente executa em 1 ciclo de clock.
- Uso eficiente do hardware.
- Exemplo: MIPS, ARM.
2.2 CISC (Complex Instruction Set Computer)
- Conjunto de instruções maior e mais complexo.
- Algumas instruções realizam tarefas de alto nível, mas são mais lentas.
- Foco na eficiência do software (menos linhas de código).
- Exemplo: x86 (Intel/AMD).
3. Registradores no MIPS
- São pequenas memórias internas do processador (muito rápidas).
- No MIPS, existem 32 registradores de 32 bits.
- Servem para armazenar dados temporários, endereços de memória e valores de controle.
Exemplos de registradores:
$t0–$t9
: registradores temporários.$s0–$s7
: valores salvos.$a0–$a3
: passagem de argumentos em funções.$v0–$v1
: valores de retorno de funções.$ra
: endereço de retorno (para JAL/JR).
4. Estrutura de um Código em Assembly MIPS
.data # Declaração de variáveis
msg: .asciiz "Hello, World!" # String armazenada na memória
num1: .word 5 # Número inteiro
num2: .word 10
result: .word 0
.text # Seção de código
main:
lw $t0, num1 # Carrega num1 em $t0
lw $t1, num2 # Carrega num2 em $t1
add $t2, $t0, $t1 # Soma $t0 + $t1 → $t2
sw $t2, result # Salva o resultado na memória
li $v0, 4 # Chamada de sistema para imprimir string
la $a0, msg
syscall
li $v0, 10 # Finaliza o programa
syscall
5. Tipos de Dados
- word → 32 bits
- half → 16 bits
- byte → 8 bits
- asciiz → strings terminadas em
\0
6. Pseudo-Instruções
São atalhos fornecidos pelo Assembler para simplificar a escrita.
- São traduzidas em uma ou mais instruções reais de máquina.
Exemplos:
li $t0, 10 # carrega imediato (Load Immediate)
move $t0, $t1 # copia valor de $t1 para $t0
la $t0, var # carrega endereço de memória em $t0
7. System Calls
São chamadas que o programa faz ao Sistema Operacional para realizar funções de I/O.
Tabela (em MIPS, $v0
guarda o código da operação):
Código (\$v0) | Operação | Argumento ($a0 , $a1 …) |
Resultado |
---|---|---|---|
1 | Imprimir inteiro | $a0 = inteiro |
- |
4 | Imprimir string | $a0 = endereço |
- |
5 | Ler inteiro | - | $v0 = inteiro |
8 | Ler string | $a0 = endereço , $a1 = tamanho |
String na memória |
10 | Encerrar programa | - | - |
11 | Imprimir caractere | $a0 = caractere |
- |
12 | Ler caractere | - | $v0 = caractere |
Exemplo MIPS:
.data
msg: .asciiz "Digite um número: "
.text
main:
li $v0, 4
la $a0, msg
syscall
li $v0, 5
syscall
move $t0, $v0 # guarda inteiro lido em $t0
8. Instruções Aritméticas
Comandos em MIPS:
add $t0, $t1, $t2 # soma
sub $t0, $t1, $t2 # subtração
mul $t0, $t1, $t2 # multiplicação
div $t0, $t1 # divisão
addi $t0, $t1, 10 # soma imediato
9. Acesso à Memória
Load (carregar da memória)
Exemplo:
lw $t0, 32($s2) # $t0 = A[8]
Store (salvar na memória)
Exemplo:
sw $t0, 48($s2) # A[12] = $t0
10. Instruções Lógicas e Deslocamento
Intruções Lógicas
and
,or
,xor
,nor
Deslocamento
sll
,srl
Exemplo deslocamento:
sll $t0, $s0, 4 # desloca 4 bits à esquerda (multiplica por 2^4)
srl $t0, $s0, 2 # desloca 2 bits à direita (divide por 2^2)
11. Controle de Fluxo
11.1 Chamada a Procedimentos
JAL (Jump and Link): chama função e salva retorno em $ra
.
JR (Jump Register): retorna de função.
Exemplo:
main:
li $a0, 5
li $a1, 10
jal soma
move $a0, $v0
li $v0, 1
syscall
soma:
add $v0, $a0, $a1
jr $ra
11.2 Instruções de Desvio Condicional
beq
→ branch if equalbne
→ branch if not equalslt
→ set less than
Exemplo loop:
li $t0, 0 # contador
li $t1, 5 # limite
loop:
beq $t0, $t1, fim
addi $t0, $t0, 1
j loop
fim:
li $v0, 10
syscall
12. Representação de Números
- Magnitude com sinal
- Complemento de 1
- Complemento de 2 (mais usado no MIPS)
- Excesso de N (para expoentes em ponto flutuante)
13. Multiplicação e Divisão de Inteiros
Usa registradores especiais HI e LO.
Exemplo:
mult $t0, $t1 # resultado 64 bits
mflo $s0 # pega parte baixa
mfhi $s1 # pega parte alta
div $t0, $t1 # quociente em LO, resto em HI
mflo $s2
mfhi $s3