Você está na página 1de 58

Aula 16

INE5607 – Organização e
Arquitetura de Computadores
Suporte para operações

 Linguagem de máquina
 Arquitetura do conjunto de instruções
(ISA)
 Instruções: “palavras”
 Conjunto de instruções: “vocabulário”
 ISA da disciplina: MIPS-32
 Microprocessor without Interlocked Pipeline
Stages
 Hennessy: Stanford
 Escolhida pela simplicidade
Suporte para operações

 Entendendo uma linguagem de montagem


(assembly):

constantes

registradores

operações

3
Suporte para operações
 Entendendo...

labels?

registradores

diretivas?

4
Suporte para operações

 Alguns elementos da linguagem de


montagem (assembly)
 Mnemônicos de endereços de memória
 Rótulos ou Labels
 Ex.: main: add $s1,$s2,$t0

 Pseudoinstruções?
 Representadas como instruções mas não são
nativas do processador
 Pseudoinstrução → instrução nativa
 move $t0,$t1 → add $t0, $zero, $t1

INE5607 - Prof. Laércio Lima Pilla 5


Suporte para operações

 Notação em assembly do MIPS


 Exemplo: a = b + c
 add a, b, c
 a: destino; b, c: fontes
 Exemplo: a = b + c + d + e
 add a, b, c
 add a, a, d
 add a, a, e

INE5607 - Prof. Laércio Lima Pilla 6


Suporte para operandos

 Registradores e variáveis
 Número ilimitado* de variáveis em software
 Número limitado de registradores
 Nem todas variáveis podem estar em registradores
simultaneamente
 Necessário alocar registradores para variáveis
 Manual: programação em assembly :~
 Automática: compilador :D

INE5607 - Prof. Laércio Lima Pilla 7


Suporte para operandos

 Registradores MIPS
 A: argumentos
 T: temporários
 S: temporários salvos (variáveis)
Nº Nome Nº Nome Nº Nome Nº Nome
0 $zero 8 $t0 16 $s0 24 $t8
1 $at 9 $t1 17 $s1 25 $t9
2 $v0 10 $t2 18 $s2 26 $k0
3 $v1 11 $t3 19 $s3 27 $k1
4 $a0 12 $t4 20 $s4 28 $gp
5 $a1 13 $t5 21 $s5 29 $sp
6 $a2 14 $t6 22 $s6 30 $fp
7 $a3 15 $t7 23 $s7 31 $ra
INE5607 - Prof. Laércio Lima Pilla 8
Suporte para operandos

 Exemplo: f = (g + h) – (i + j)
 O que um compilador faria?
 $s0=f, $s1=g, $s2=h, $s3=i, $s4=j
 add $t0, $s1, $s2
 add $t1, $s3, $s4
 sub $s0, $t0, $t1
 Assembly MIPS de verdade

INE5607 - Prof. Laércio Lima Pilla 9


Suporte para operandos

E os operandos que não são


variáveis?
 Exemplo: x = A[10] + A[11]
 Estruturas de dados não cabem nos
registradores
 São mantidas em memória!

INE5607 - Prof. Laércio Lima Pilla 10


Suporte para operandos

 Memória
 Array unidimensional
 Composta de palavras
 Palavras armazenam dados
 Acessadas pelos endereços
 x = A[10] + A[11] -> add $s0, A[10], A[11]?
Endereço Dados
... ...
3 100
2 10
1 101
0 1

INE5607 - Prof. Laércio Lima Pilla 11


Suporte para operandos

• x = A[10] + A[11] -> add $s0, A[10], A[11]?


 Resposta: não.
 Instruções de transferência de dados
 Load: dado da memória para registrador
 Store: dado do registrador para memória
 Nenhuma outra instrução acessa memória
 Somente operandos em registradores
 Estruturas de dados precisam ser carregadas

INE5607 - Prof. Laércio Lima Pilla 12


Suporte para operandos

 Exemplo: A[2] = A[1] + i


 Endereço base de A[] em $s5
 Valor de i em $s0
lw $t0, 4($s5)
 lw: load word
 lw destino, fonte add $t1, $t0, $s0
 sw: store word sw $t1, 8($s5)
 sw fonte, destino
 $s0 = registrador
 ($s0) = valor no registrador
 De onde vêm os valores 4 e 8?

INE5607 - Prof. Laércio Lima Pilla 13


Suporte para operandos

 De onde vem os valores 4 e 8?


 Endereçamento de palavra
 Palavra = 4 bytes no MIPS 32
 4 bytes = 32 bits
 char = 1 byte, half = 2 bytes, word = 4 bytes

Endereço Dados
... ...
12 100
8 10
4 101
0 1

INE5607 - Prof. Laércio Lima Pilla 14


Suporte para operandos

 Operandos constantes
 Como fica i = i + 1?
 Solução 1: memória para constantes
 lw $t0, EndConstante1($s1)
 add $s3, $s3, $t0
 Uma leitura para cada operação com constantes?
 Solução 2: constante interna à instrução
 addi $s3, $s3, 1

INE5607 - Prof. Laércio Lima Pilla 15


Suporte para operandos

 Como manter as variáveis?


 Uso frequente?
 Register allocation: variáveis em
registradores
 Acesso rápido
 Uso raro?
 Register spilling: variáveis em memória
 Lidas e escritas quando necessário

INE5607 - Prof. Laércio Lima Pilla 16


Operações aritméticas

 add: a = b + c
 add a, b, c
 add $s0, $s1, $s2
 Tipo R
op rs rt rd shamt funct
 addi: a = a + 1
 addi a, a, 1
 Tipo I
op rs rt constante/endereço

INE5607 - Prof. Laércio Lima Pilla 17


Operações aritméticas

 sub: a = b - c
 sub a, b, c
 sub $s0, $s1, $s2
 Tipo R
 subi: a = a - 1
 Não existe
 addi: constante em complemento de 2
 addi $s0, $s0, -1
 -1 = 0b1111 1111 1111 1111, 0xFFFF

INE5607 - Prof. Laércio Lima Pilla 18


Operações aritméticas

 Exercício 1
 Traduzam o seguinte código para
linguagem de montagem MIPS
 x = ((x+300) – y) + z + 27 + x
 x = $s0, y = $s1, z = $s2

INE5607 - Prof. Laércio Lima Pilla 19


Operações lógicas

 Deslocamentos e operações bit a bit


Operação Operador C Operador Instruções
lógica Java do MIPS
Shift left << << sll
Shift right >> >>> srl
Bit-by-bit AND & & and, andi
Bit-by-bit OR | | or, ori
Bit-by-bit ~ ~ nor
NOT

INE5607 - Prof. Laércio Lima Pilla 20


Operações lógicas

 sll: a = b << 5
 sll a, b, 5
 sll $s0, $s1, 5

INE5607 - Prof. Laércio Lima Pilla 21


Operações lógicas

 and: a=a&b A B S
0 0 0
 and $s0, $s0, $s1 0 1 0

 andi: a = a & 0x000F 1 0 0


1 1 1
 andi $s0, $s0, 15
 O que acontece com os bits mais
significativos?

INE5607 - Prof. Laércio Lima Pilla 22


Operações lógicas

 or: a=a|b A B S
0 0 0
 or $s0, $s0, $s1 0 1 1

 ori: a = a | 0x000F 1 0 1
1 1 1
 ori $s0, $s0, 15
 O que acontece com os bits mais
significativos?

INE5607 - Prof. Laércio Lima Pilla 23


Operações lógicas

A S
 not: a = ~a 0 1
 not $s0, $s0 1 0

 Não existe.
 Forma correta: nor A B S

 nor a, a, b -> a = ~(a|b) 0 0 1


0 1 0
 nor $s0, $s0, $s1 1 0 0
 Para not 1 1 0

 nor $s0, $s0, $zero

INE5607 - Prof. Laércio Lima Pilla 24


Operações lógicas

 Exercício 2
 Traduzam o seguinte código para
linguagem de montagem MIPS
 s = (a & b) | (!a & c)

INE5607 - Prof. Laércio Lima Pilla 25


Carregamento de constantes

 Load Immediate: a = 5
 Li $s0, 5
 Carrega valor constante de 32 bits
 Pseudoinstrução!
 Como implementar?

INE5607 - Prof. Laércio Lima Pilla 26


Exercício 3

 Compileo seguinte código de


linguagem de alto nível:
 Valor = 4*(a+b+c+d)
 Usar $sx para as variáveis em ordem
 Valor vai para $v0

INE5607 - Prof. Laércio Lima Pilla 27


Exercício 4

 Compileo seguinte código de


linguagem de alto nível:
 Vetor[0] = Vetor[1+Vetor[2]]
 Considere que o endereço de vetor está
armazenado em $s4

INE5607 - Prof. Laércio Lima Pilla 28


Exercício 5

 Considere a seguinte situação:


 $t8 = 0x00BADBED
 $t9 = 0xAFADA007
 Qual seria o valor de $s6 após a
execução das instruções abaixo?
 sll $t1, $t8, 4
 and $t1, $t1, $t9
 ori $s6, $t1, 20

INE5607 - Prof. Laércio Lima Pilla 29


Exercício 6

 Defina um Array Conta com 10


posições e inicialize ele com
valores inteiros aleatórios entre 0e
100.
 Escreva o código em assembly do
MIPS que coloca no registrador
$s0 a média das posições
Conta[3] e Conta[7].

INE5607 - Prof. Laércio Lima Pilla 30


Desvios

 Desvios condicionais
 beq: branch on equal
 beq $s0, $s1, Igual
 Se $s0 == $s1, desvie para o endereço do label Igual
 bne: branch on not equal
 bne $s0, $s1, Diferente
 Se $s0 != $s1, desvie para o endereço do label Diferente

31
Desvios

 Desvios incondicionais
 j: jump
 j Fim
 Desvie para o endereço do label Fim

32
Desvios
 Desvios incondicionais
 jal: jump and link
 Salve o endereço atual em $ra e desvie
 Suporte para chamadas de
procedimentos
 Tipo J
 jr: jump register
 Desvie para o endereço no registrador X
 Suporte para o retorno de procedimentos
 Tipo R

33
If-then-else

 Exemplo em alto nível


 if (i == j) {f = g + h;} else {f = g – h;}
 Convenção (f,g,h,i,j) = ($s0,$s1,$s2,$s3,$4)
 Programa monolítico em fluxograma
i==j i!=j
i == j?

f=g+h f=g-h

34
If-then-else
 Programa monolítico em fluxograma

i==j i!=j i==j i!=j


i == j? i == j?

else: then:
f=g-h f=g+h

then: else:
f=g+h f=g-h

exit: exit:
35
If-then-else

 Exemplo em alto nível


 if (i == j) {f = g + h;} else {f = g – h;}
 Convenção (f,g,h,i,j) = ($s0,$s1,$s2,$s3,$4)
 Linguagem de montagem
beq $s3, $s4, then bne $s3, $s4, else
sub $s0, $s1, $s2 add $s0, $s1, $s2
j exit j exit
then: add $s0, $s1, $s2 else: sub $s0, $s1, $s2
exit: ... exit: ...

36
If-then-else

i==j i!=j
i == j?
bne $s3, $s4, else
add $s0, $s1, $s2 then:
j exit
f=g+h
else: sub $s0, $s1, $s2
exit: ...
else:
f=g-h

exit:
37
Comparadores

 Testes mais populares


 Igualdade e desigualdade
 Embutidos em desvios condicionais
 Teste “menor que”
 Instrução de comparação
 slt: set less than
 Variações: slti, sltu, sltiu

38
Comparadores
 Comparação entre duas variáveis
 slt $t0, $s3, $s4
 $t0 = 1 se $s3 < $s4
 $t0 = 0 caso contrário
 Comparação entre variável e
constante
 slti $t0, $s2, 10
 $t0 = 1 se $s2 < 10
 $t0 = 0 caso contrário

39
Comparadores
 Exemplo em alto nível
 if (a < b) c = a; else c = b;
 a=$s1, b=$s2, c=$s0

 slt $t0, $s1, $s2


 beq $t0, $zero, else
 add $s0, $zero, $s1 #$t0 == 1, a < b
 j exit
 else: add $s0, $zer0, $s2 #$t0 == 0, a >= b
 exit: ...

40
Switch
if(mPV == -1) mPR = 10;
 Instrução Case/Switch else if(mPV == 1) mPR = 20;
switch (minhaPrimeiraVariavel){ else mPR = 30;
case -1:
minhaPrimeiraResposta = 10;
break;
case 1:
minhaPrimeiraResposta = 20;
break;
default:
minhaPrimeiraResposta = 30;
}

41
Desvios

• Qual a diferença entre while, for e repeat?


– while e for: teste no início
– repeat: teste no fim

– for define inicialização e iteração


– while e repeat não definem

INE5607 - Prof. Laércio Lima Pilla 42


WHILE

INE5607 - Prof. Laércio Lima Pilla 43


While
• while (save[i] == k) i++;
• Programa monolítico em fluxograma
loop: save[i]
== k

sim
não
i++

exit:

INE5607 - Prof. Laércio Lima Pilla 44


While

• while (save[i] == k) i++;


– Ler save[i] da memória
• Necessário calcular o endereço primeiro
– Comparar com k
• Sair do laço caso seja diferente
– Senão fazer i++ e voltar no loop

INE5607 - Prof. Laércio Lima Pilla 45


While

• while (save[i] == k) i++;


– i = $s3, k = $s5, endereço base de save = $s6

Loop: sll $t1, $s3, 2 # $t1 = 4*i


add $t1, $t1, $s6 # $t1 = *save[i]
lw $t0, 0($t1) # $t0 = save[i]
bne $t0, $s5, Exit # vá p/ Exit se
# save[i] ≠ k
addi $s3, $s3, 1 # i = i+1
j Loop
Exit: ...

INE5607 - Prof. Laércio Lima Pilla 46


While

• while ( teste ) operação

loop: preparação teste


teste com salto condicional para
saída
operação
salto incondicional para o loop
saída: ...

INE5607 - Prof. Laércio Lima Pilla 47


FOR

INE5607 - Prof. Laércio Lima Pilla 48


For
• for ( i=0 ; i < vetor.size() ; i++ )
– vetor[i] = 2*vetor[i]; i=0

loop: i<
vetor.size()

sim
não
i++ op

exit:
INE5607 - Prof. Laércio Lima Pilla 49
For

• for ( início ; teste ; itera ) operação

início
loop: preparação teste
teste com salto condicional para
saída
operação
itera
salto incondicional para loop
saída: ...
INE5607 - Prof. Laércio Lima Pilla 50
REPEAT

INE5607 - Prof. Laércio Lima Pilla 51


Repeat

loop:
op
• repeat...until, do...while, etc.
• do {valor = valor/2; i++} sim

• while (valor >= 1) valor


>= 1
não

INE5607 - Prof. Laércio Lima Pilla 52


Repeat
• do {valor = valor/2; i++}
• while (valor >= 1)
• $s0 = valor, $s5 = i loop:
op
loop: srl $s0, $s0, 1
sim
addi $s5, $s5, 1
valor
slti $t0, $s0, 1 >= 1
beq $t0, $zero, loop
não

INE5607 - Prof. Laércio Lima Pilla 53


Repeat

• do operação while ( teste )

loop: operação
preparação teste
teste com salto condicional para
loop

INE5607 - Prof. Laércio Lima Pilla 54


Repeat
• while vs repeat

loop: loop:
teste op

sim sim
não
op teste

não
exit:

INE5607 - Prof. Laércio Lima Pilla 55


EXERCÍCIOS

INE5607 - Prof. Laércio Lima Pilla 56


Exercício 7

• Faça o papel do compilador para o seguinte


código
– for ( i = 0 ; i < y ; i ++ ) x *= z;
• Considere que existe uma pseudoinstrução mult
que é composta de várias instruções mais simples
– mult $t0, $t1, $t2 -> $t0 = $t1 * $t2

INE5607 - Prof. Laércio Lima Pilla 57


Exercício 8

• Que construção de iteração é usada abaixo


e o que faz o código?
move $t0, $zero
loop: sll $t1, $t0, 2 $a0 = endereço vetor
add $t2, $a0, $t1 $a1 = tamanho de vetor
sw $zero, 0($t2)
addi $t0, $t0, 1
slt $t3, $t0, $a1
bne $t3, $zero, loop

INE5607 - Prof. Laércio Lima Pilla 58

Você também pode gostar