























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
Instrução MIPS Assembly. Exemplo de converter um código C para MIPS
Tipologia: Resumos
1 / 31
Esta página não é visível na pré-visualização
Não perca as partes importantes!
O MIPS trabalha com 3 operandos.
add a,b,c # a Áb + c ( # significa comentário )
Programa em C Assembly MIPS a = b + c; d = a – c;
add a,b,c sub d,a,c f = ( g + h ) – ( i + j ); add t0,g,h add t1,i,j sub f,t0,t 1 o compilador cria t0 e t.
No MIPS são 32 registradores de 32 bits ( $0 .... $31)
Exemplo
Programa em C Assembly MIPS f = ( g + h ) – ( i + j ); add $t0,$s1,$s add $t1,$s3,$s sub $s0,$t0,$t
lw Ë instrução de movimentação de dados da memória para registrador ( load word )
sw Ë instrução de movimentação de dados do registrador para a memória ( store word )
Exemplo
Seja A um array de 100 palavras. O compilador associou à variável g o registrador $s1 e a h $s2, além de colocar em $s3 o endereço base do vetor. Traduza o comando em C abaixo.
g = h + A[8];
Solução
Primeiro devemos carregar um registrador temporário com A[8]:
lw $t0, 8($s3) # registrador temporário $t recebe A[8]
Agora basta executar a operação:
add $s1,$s2,$t0 # g = h + A[8]
Exemplo
Supor que o índice seja uma variável:
g = h + A[i]; onde: i é associado a $s4, g a $s1, h a $s2 e endereço base de A a $s3.
Solução
add $t1,$s4,$s add $t1,$t1,$t1 # $t1 recebe 4*i ( porque ??? )
add $t1,$t1,$s3 # $t1 recebe o endereço de A[i]
lw $t0,0($t1) # $t0 recebe a[i] add $s1,$s2,$t
$s0 .. $s7 Ë 16 .. 23 $t0 .. $t7 Ë 8 .. 15
Exemplo
Formato da instrução add $t0,$s1,$s
op Ë operação básica da instrução (opcode) rs Ë o primeiro registrador fonte rt Ë o segundo registrador fonte rd Ë o registrador destino shamt Ë shift amount, para instruções de deslocamento funct Ë function. Seleciona variações das operação especificada pelo opcode
0 17 18 8 0 32
código da adição
$s1 $s2 $t0 não usado nesta instrução
6 5 5 5 5 6 bits bits bits bits bits bits
op rs rt rd shamt funct
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
beq registrador1, registrador2, L1 Ë se o valor do registrador1 for igual ao do registrador2 o programa será desviado para o label L1 ( beq = branch if equal).
bne registrador1, registrador2, L1 Ë se o valor do registrador1 não for igual ao do registrador2 o programa será desviado para o label L1 ( beq = branch if not equal).
Exemplo - Compilando um comando IF.
Seja o comando abaixo:
if ( i == j ) go to L1; f = g + h; L1: f = f - i;
Supondo que as 5 variáveis correspondam aos registradores $s0..$s4, respectivamente, como fica o código MIPS para o comando?
Solução
beq $s3,$s4,L1 # vá para L1 se i = j add $s0,$s1,$s2 # f = g + h, executado se i != j L1: sub $s0,$s0,$s3 # f = f – i, executado se i = j
Solução
Loop: add $t1,$s3,$s3 # $t1 = 2 * i add $t1,$t1,$t1 # $t1 = 4 * i add $t1,$t1,$s5 # $t1 recebe endereço de A[i] lw $t0,0($t1) # $t0 recebe A[i] add $s1,$s1,$t0 # g = g + A[i] add $s3,$s3,$s4 # i = i + j bne $s3,$s2,Loop # se i != h vá para Loop
Exemplo
while (save[i] == k) i = i + j;
Solução
Para i,j e k correspondendo a $s3,$s4 e $s5, respectivamente, e o endereço base do array em $s6, temos:
Loop: add $t1,$s3,$s3 # $t1 = 2 * i add $t1,$t1,$t1 # $t1 = 4 * i add $t1,$t1,$s6 # $t1 = endereço de save[i] lw $t0,0($t1) # $t0 recebe save[i] bne $t0,$s5,Exit # va para Exit se save[i] != k add $s3,$s3,$s4 # i = i + j j Loop Exit:
slt reg_temp, reg1, reg2 Ë se reg1 é menor que reg2, reg_temp é setado, caso contrário é resetado.
Observação: Para utilizações específicas, os compiladores MIPS associam o registrador $0 ao valor zero ($zero).
Exemplo
Compilando o teste less than
Solução:
slt $t0,$so,$s1 # $t0 é setado se $s0 < $s bne $t0,$zero,Less # vá para Less, se $t0 != 0 , ou seja a<b
Exemplo – Compilando o case/switch
Seja o comando abaixo:
switch (k) { case 0: f = f + j; break; case 1: f = g + h; break; }
jal End_proc - (jump-and-link) Ë desvia para o procedimento e salva o endereço de retorno (PC+4) em $ra (return address - $31)
jr $ra Ë desvia para o ponto de onde foi chamado o procedimento
Solução:
Os parâmetros g, h, i e j correspondem a $a0 .. $a3, respectivamente e f a $s0. Antes precisaremos salvar $s0, $t0 e $t1 na pilha, pois serão usados no procedimento
sub $sp,$sp,12 # ajuste do sp para empilhar 3 palavras sw $t1,8($sp) # salva $t1 na pilha sw $t0,4($sp) # salva $t0 na pilha sw $s0,0($sp) # salva $s0 na pilha
No procedimento
add $t0,$a0,$a add $t1,$a2,$a sub $s0,$t0,$t
Para retornar o valor f
add $v0,$s0,$zero
Antes do retorno é necessário restaurar os valores dos registradores salvos na pilha
lw $s0, 0($sp) lw $t0, 4($sp) lw $s1, 8($sp) add $sp,$sp,
Retornar
jr $ra
Contents of register $s
Contents of register $t
Contents of register $t
$sp
$sp
$sp
Highaddress
Lowaddress a. b. c. Figura 3.10 – Valores de sp antes, durante e depois da chamada do procedimento
Exemplo – procedimento recursivo
_Int fact (int n) { if (n<1) return(1); else return (nfact(n-1)); }_*
Registradores Preservados Registradores Não Preservados Salvos: $s0-$s7 Temporários: $t0-$t Apontador para pilha: $sp Argumentos: $a0-$a Endereço de retorno: $ra Valores de Retorno: $v0-$v Pilha acima do Apontador para pilha
Pilha abaixo do Apontador para pilha
Saved argument registers (if any)
Local arrays and structures (if any)
Saved saved registers (if any)
Saved return address
b.
$sp
$sp
$sp
c.
$fp
$fp
$fp
a.
High address
Low address
Figura 3.12 – Ilustração da pilha antes, durante e depois da chamada de procedimento.
Não
$a0-$a3 4-7 Argumentos Sim $t0-$t7 8-15 Temporários Não $s0-$v7 16-23 Salvos Sim $t8-$t9 24-25 Temporários Não $gp 28 Ponteiro global Sim $sp 29 Ponteiro para pilha Sim $fp 30 Ponteiro para frame Sim $ra 31 Endereço de retorno Sim