-
Um programa em assembly MIPS possui o seguinte esqueleto:
- data (seção de dados)
- text (seção de código)
→ main (rotina principal - rótulo)
→ rótulo: "apelido" para um endereço de memória
-
A execução do código começa na linha rotulada por
main
e segue linha após linha (salvo se houver um desvio). A esse paradigma chamamos sequencial.
.word w1, w2, ..., wm
-> dado de 32 bits.half h1, h2, ..., hn
-> dado de 16 bits.byte b1, b2, ..., bn
-> dado de 8 bits.asciiz "string"
-> sequência de caracteres ASCII terminada por 0
.data
msg: .asciiz "Hello World!\n"
x: .word 0x12345678
msg
: rótulo para o endereço de memória onde está armazenada a string "Hello World!\n"
- Escrita na tela, leitura de dados, alocação de memória, encerrar o programa, etc.
- Para executar uma chamada ao sistema, precisamos fazer o seguinte:
- Carregar o número da chamada ao sistema no registrador
$v0
- Carregar os argumentos da chamada ao sistema nos registradores
$a0
,$a1
,$a2
,$a3
(opcional, depende da operação) - Executar a instrução
syscall
- Colher o retorno (opcional) nos regs
$v0
e$v1
.
- Para representar o zero, há um registrador especial chamado
$zero
, que sempre contém o valor 0. - Instruções imediatas: variações de algumas instruções, terminando o mnemônico com i, que trabalha com dois registradores e uma constante (nessa ordem).
addi $t0, $t0, 1 # Comentário: $t0 = $t0 + 1
- São instruções simplifica que não pertencem à ISA e que são traduzidas pelo montador para instruções. 3 pseudoinstruções úteis:
-
li $t0, 10
-> carrega o valor 10 no registrador$t0
→li reg const
→ li = load immediate -
move $t0, $t1
-> move o conteúdo do registrador$t1
para o registrador$t0
→move reg1 reg2
-
la $t0, msg
-> carrega o endereço da stringmsg
no registrador$t0
→la reg label
→ la = load address
.data
msg: .asciiz "Hello World!\n"
.text
main:
li $v0, 4 # carrega o número da chamada ao sistema para imprimir string
la $a0, msg # carrega o endereço da string para imprimir
syscall # executa a chamada ao sistema
li $v0, 10 # carrega o número da chamada ao sistema para encerrar o programa
syscall # executa a chamada ao sistema
syscall 4
: imprime string na telasyscall 10
: encerra o programa/processo- Para acessar o código, clique aqui.