Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Arquivo sobre instrução Mips, Resumos de Arquitetura

Instrução MIPS Assembly. Exemplo de converter um código C para MIPS

Tipologia: Resumos

2014

Compartilhado em 31/08/2021

Abelardo-fisico
Abelardo-fisico 🇧🇷

1 documento

1 / 31

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
ARQUITETURA DE SISTEMAS COMPUTACIONAIS - RICARDO PANNAIN 30
3. INSTRUÇÕES
Instrução é uma palavra da linguagem de máquina
Instruction Set do MIPS ( usado pela NEC, Nintendo, Silicon
Graphics e Sony.
Operações
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,t1
o compilador cria t0 e t1 .
Operandos
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,$s2
add $t1,$s3,$s4
sub $s0,$t0,$t1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f

Pré-visualização parcial do texto

Baixe Arquivo sobre instrução Mips e outras Resumos em PDF para Arquitetura, somente na Docsity!

3. INSTRUÇÕES

  • Instrução é uma palavra da linguagem de máquina
  • Instruction Set do MIPS ( usado pela NEC, Nintendo, Silicon Graphics e Sony.
  • Operações

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.

  • Operandos

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

  • Instruções de movimentação de dados Ë load e store

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

  • Figura 3.4 – MIPS architecture
  • Formato de instruções - representação de instruções no computador

$s0 .. $s7 Ë 16 .. 23 $t0 .. $t7 Ë 8 .. 15

Exemplo

Formato da instrução add $t0,$s1,$s

  • Formato das instruções e seus campos
    • R-type

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

  • Figura 3.6 – MIPS architecture
  • Instruções para tomada de decisões

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

  • Usando while

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:

  • Instrução para teste de maior ou menor

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; }

  • Figura 3.9 – MIPS architecture
  • Suporte a procedimentos
    • Para a execução de um procedimento deve-se:
      • Colocar os parâmetros em um local onde o procedimento possa acessá-los
      • Transferir o controle ao procedimento
      • Adquirir os recursos necessários ao procedimento
      • Executar a tarefa
      • Colocar o resultado em um local onde o programa possa acessá-lo
      • Retornar o controle ao ponto onde o procedimento foi chamado
  • Para este mecanismo, o MIPS aloca seus registradores, para chamada de procedimentos, da seguinte maneira:
    • $a0 .. $ a3 Ë 4 registradores para passagem de argumentos
    • $v0 .. $v1 Ë para retornar valores
    • $ra Ë para guardar o endereço de retorno
  • Instrução para chamada de procedimento

jal End_proc - (jump-and-link) Ë desvia para o procedimento e salva o endereço de retorno (PC+4) em $ra (return address - $31)

  • Instrução para retorno de chamada de procedimento

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

  • Observações
    • $t0 .. $t9 Ë 10 registradores temporários que não são preservados em uma chamada de procedimento
    • $s0 .. $s7 Ë 8 registradores que devem ser preservados em uma chamada de procedimento

Exemplo – procedimento recursivo

_Int fact (int n) { if (n<1) return(1); else return (nfact(n-1)); }_*

  • Figura 3.11 – O que é preservado ou não numa chamada de procedimento.

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.

  • Figura 3.13 – Convenção de registradores no MIPS Nome Número Uso Preservado em chamadas? $zero 0 Constante 0 n.d $v0-$v1 2-3 Resultados e avaliações de expressões

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