Sumário - Amazon S3

Propaganda
Organização e Arquitetura de Computadores
Aula 1 - Introdução
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Introdução 1
Juliana F Camapum Wanderley
Sumário
„
Introdução a Arquitetura de Computadores
„
Organização e Anatomia de um Computador
„
Mudanças Tecnológicas Rápidas
„
Conclusões
OAC – Introdução 2
Juliana F Camapum Wanderley
1
Introdução
„
Nos anos 60/70:
„
„
minimizar espaço em memória melhora o
desempenho
Problema atual:
„
„
„
„
hierarquia de memórias
paralelismo dos processadores (pipeline)
otimização dos compiladores
sistema operacional...
Juliana F Camapum Wanderley
OAC – Introdução 3
O que é "Arquitetura de Computadores"?
Application (Netscape)
Compiler
Software
Hardware
Assembler
Operating
System
(Linux)
Processor Memory I/O system
AC
Instruction Set
Architecture
Datapath & Control
Digital Design
Circuit Design
transistors
Arquitetura do conjunto de instruções + Organização da máquina
„ Coordenação de muitos Níveis de Abstração
„
OAC – Introdução 4
Juliana F Camapum Wanderley
2
Abstração
„
„
„
Maior aprofundamento revela mais
informações
Uma abstração omite detalhes desnecessários,
ajudando a lidar com a complexidade
É uma descrição simplificada ou seletiva de um
sistema
OAC – Introdução 5
Juliana F Camapum Wanderley
Arquitetura do Conjunto de Instruções
„
Uma importante abstração
„
interface entre hardware e software de baixo nível
„
padronização das instruções, linguagem de máquina, etc...
„
Vantagens: diferentes implementações da mesma
arquitetura
„
desvantagem: algumas vezes impossibilita o uso de
inovações
„
Modernas arquiteturas de conjunto de instruções:
„
Intel (80x86/Pentium/K6/MMX), PowerPC, DEC Alpha, SGI
MIPS, SUN SPARC, HP PA-RISC
OAC – Introdução 6
Juliana F Camapum Wanderley
3
Arquitetura do Conjunto de Instruções
„
Conjunto de instruções (ou códigos de operação).
Categorias de Instruções - MIPS R3000
„
„
„
„
„
„
„
Formato das instruções.
3 formatos de instruções (32 bits) - MIPS R3000
„
„
„
„
Carregar/Armazenar
Cálculo
Desvio
Ponto flutuante
Gerenciamento de Memória
Tipos e estruturas de dados, codificação e representação
Modos de endereçamento e acesso a dados e instruções.
Organização da memória.
Juliana F Camapum Wanderley
OAC – Introdução 7
Níveis de Representação
temp = v[k];
v[k] = v[k+1];
v[k+1] = temp;
High Level Language
Program (e.g., C)
Compiler
AC
lw
lw
sw
sw
Assembly Language
Program (e.g.,MIPS)
Assembler
Machine Language
Program (MIPS)
Machine Interpretation
Control Signal
Specification
OAC – Introdução 8
°
°
0000
1010
1100
0101
1001
1111
0110
1000
1100
0101
1010
0000
$t0,
$t1,
$t1,
$t0,
0110
1000
1111
1001
0($2)
4($2)
0($2)
4($2)
1010
0000
0101
1100
1111
1001
1000
0110
0101
1100
0000
1010
1000
0110
1001
1111
Juliana F Camapum Wanderley
4
Por trás do Programa
Computadores: dois dígitos – 0 e 1 (bit’s).
„ Em computadores: bits são agrupados em grupos na memória:
„
„
„
Z-80 – Grupos de 8 bits (1 byte).
MIPS – Grupos de 32 bits.
Memória de um computador:
Endereço Conteúdo
0
0000 0000 0000 0000
1
0000 0000 0000 0000
2
0000 0000 0000 0000
„ Representação popular: em hexa:
Endereço
Conteúdo
0000 0000
0000 0098
0000 0001
0000 F098
„
0000 0000 1001 1000
0000 1000 0001 1010
1111 0000 1001 1000
Significado dos bits:
Programas, números, texto,
imagens, sons, etc.
OAC – Introdução 9
Juliana F Camapum Wanderley
Organização da Máquina
„
Características de performance e capacidade das principais
unidades funcionais.
„
Registradores, Unidade lógica e aritmética, Unidade de controle ...
„
Como estas unidades funcionais são conectadas.
„
A natureza das informações trocadas entre componentes.
„
A lógica e os meios pelos quais é controlado este fluxo de
informações.
OAC – Introdução 10
Juliana F Camapum Wanderley
5
Anatomia: 5 componentes de qualquer Computador
Computador Pessoal
Computador
Processador
Controle
Datapath
Via de dados
Memória
(onde
programas,
dados
vivem qdo
rodando)
Devices
Input
Entrada
Output
Saída
Teclado,
Mouse
Disco
(onde
programas,
dados
vivem quando
não estão
rodando)
Monitor,
Impressora
OAC – Introdução 11
Juliana F Camapum Wanderley
Nosso primeiro enfoque
„
O processador (datapath e controle)
„ Implementado usando milhões de
transistores
„ Impossível de entender olhando cada
transistor
„ Nós precisamos de abstrações
OAC – Introdução 12
Juliana F Camapum Wanderley
6
Arquitetura de Computadores
Arquitetura
Pentium
Data
cache
Control
Instruction
cache
Integer data path
Branch
Bus
Floatingpoint
data path
OAC – Introdução 13
Juliana F Camapum Wanderley
Mudanças tecnológicas
„
Grande desenvolvimento da eletrônica
„
Transistor: chave on/off
„
CI: dúzias a milhões de transistores em um VLSI.
OAC – Introdução 14
Juliana F Camapum Wanderley
7
Circuitos Integrados
Silício → semicondutor. Pode ser:
„
„
„
„
Excelentes condutores.
Excelentes isolantes.
Áreas que alternam entre condutores e isolantes (chaves).
Fabricação:
„
„
„
„
„
Bastão (ingot) – diâmetro de 6 a 12 polegadas,
comprimento de 12 a 24 polegadas.
Fatiados em finas fatias → wafers (largura de 0,1
polegada).
Série de passos de processamento químico, que cria
transistores, condutores e isolantes.
Conectar o chip com os pinos externos. Encapsulamento.
Juliana F Camapum Wanderley
OAC – Introdução 15
Tendências Tecnológicas: Capacidade
de Memória (cada chip DRAM)
size
Ano
Tam. (Mbit)
1980
0.0625
1983
0.25
1986
1
1989
4
1992
16
1996
64
2000
256
1000000000
100000000
10000000
1000000
100000
10000
1000
1970
1975
1980
1985
1990
1995
2000
Year
- Aprox 1.4X/ano, ou dobro a cada 2 anos.
- 4000X desde 1980.
OAC – Introdução 16
Juliana F Camapum Wanderley
8
Tendências Tecnológicas: Complexidade do
Microprocessador
100000000
Athlon (K7): 22 Milhões
Alpha 21264: 15 milhões
Pentium Pro: 5.5 milhões
PowerPC 620: 6.9 milhões
Alpha 21164: 9.3 milhões
Sparc Ultra: 5.2 milhões
10000000
Lei de Moore
Pentium
i80486
1000000
i80386
i80286
100000
2X transistores/Chip
Cada 1.5 anos
i8086
10000
i8080
i4004
1000
1970
1975
1980
1985
Year
1990
1995
2000
Chamada
"Lei de Moore"
Juliana F Camapum Wanderley
OAC – Introdução 17
Tendências Tecnológicas: Desempenho de
Processador
Intel P4 1500 MHz
(Prim. 2001)
1200
1100
1000
900
800
700
600
500
400
300
200
100
0
DEC Alpha
21264/600
1.54X/ano
DEC Alpha 5/500
DEC Alpha 5/300
DEC Alpha 4/266
IBM POWER 100
87 88 89 90 91 92 93 94 95 96 97
Desempenho Processador aumento/ano, erroneamente
referido como Lei de Moore (transistores/chip)
OAC – Introdução 18
Juliana F Camapum Wanderley
9
Tecnologia do Computador
Mudança Dramática!
„ Processador
„ 2X em veloc. cada 1.5 anos;
100X desempenho na última década.
„ Memória
„ Capacidade DRAM: 2x / 2 anos; 64x tamanho na última
década.
„ Disco
„ capacidade: > 2X em tamanho cada 1 ano.
„ Custo por bit: melhora cerca de 100% por ano.
„ 120X tamanho na última década.
OAC – Introdução 19
Juliana F Camapum Wanderley
Tecnologia do Computador
Mudança Dramática
„ PC Estado-da-arte:
„ Velocidade Clock do Processador:
4000 MHz
(4.0 GigaHertz)
„ Capacidade da Memória:
1000 MegaByte
(1.0 GigaBytes)
„ Capacidade do Disco:
1000 GigaBytes
(1.0 TeraBytes)
„ Novas unidades! Mega => Giga, Giga => Tera
OAC – Introdução 20
Juliana F Camapum Wanderley
10
Por que Estudar Arq de Computadores?
„ Mudança; É excitante!; nunca foi tão excitante!
„ Impacta todos os outros aspectos de engenharia
elétrica/eletrônica e ciência dos computadores.
Bionics:
Sensors in latex fingers
instantly register hot
and cold, and an electronic
interface in his artificial
limb stimulates the nerve
endings in his upper arm,
which then pass the
information to his brain.
The $3,000 system allows
his hand to feel pressure
and weight, so for the first
time since losing his arms
in a 1986 accident, he can
pick up a can of soda
without crushing it or
having it slip through his
fingers. One Digital Day
OAC – Introdução 21
Juliana F Camapum Wanderley
AC: Então, o que aprenderei neste curso?
„
Arq de Computadores do ponto de vista
do programador
„
„
„
„
O que o programador escreve
Como é convertido para algo que o
computador entende
Como o computador interpreta o programa
O que torna programas lentos
OAC – Introdução 22
Juliana F Camapum Wanderley
11
AC: Então, o que será visto neste curso?
„ Aprender as grandes idéias em CC e engenharia:
„ 5 componentes clássicos de um computador
„ Dados podem ser qualquer coisa (inteiros, ponto flutuante,
caracteres); um programa determina o que ele é
„ Conceito de programa armazenado: instruções são apenas dados
„ Princípio de Localidade, explorado via hierarquia de memória (cache)
„ Maior performance via exploração de paralelismo (pipeline).
„ Princípio de abstração, utilizado para construir sistemas em camadas
„ Compilação vs. Interpretação através das camadas do sistema.
„ Princípios/Armadilhas de Medidas de Desempenho.
OAC – Introdução 23
Juliana F Camapum Wanderley
O que AC não é
„ Aprendizado de C
C
„Se você sabe uma, você deveria ser capaz de aprender outra ling. de
programação praticamente sozinho.
C++ „Dado que você sabe Pascal ou Java, deve ser mais ou menos fácil
entender/aprender C.
Java„ Programação em Linguagem Assembly
„Esta é uma habilidade que você aprenderá como um efeito colateral
de entender as Grandes Idéias.
„ Projeto de Hardware
„Nós trabalharemos com hardware em nível de abstração, com
muito pouco de lógica física para que tenhamos uma
perspectiva adequada do assunto.
OAC – Introdução 24
Juliana F Camapum Wanderley
12
Organização do curso
„
„
„
„
„
„
„
„
„
Desempenho (Capítulo 2)
Uma arquitetura de conjunto de instruções (Capítulo 3)
Aritmética e como construir uma ALU (Capítulo 4)
Lógica Seqüencial (Apêndice B)
Construção de um processador para executar nossas
instruções (Capítulo 5)
Mapeamento do Controle no Hardware (Apêndice C)
Pipelining para melhorar desempenho (Capítulo 6)
Memória: caches e memória virtual (Capítulo 7)
I/O (Capítulo 8)
Chave para um bom curso: Ler o livro!
OAC – Introdução 25
Juliana F Camapum Wanderley
Literatura
„
Livro Texto:
„ Requerido: Organização e Projeto de Computadores: A
Interface Hardware/Software, Segunda Edição, Patterson and
Hennessy (P&H) - Editora LTC
OAC – Introdução 26
Juliana F Camapum Wanderley
13
Leitura
„
Todo o capítulo 1 do livro texto
„
OAC – Introdução 27
Itens 1.1 - 1.8
Juliana F Camapum Wanderley
14
Organização e Arquitetura de Computadores
Aula 2 - Desempenho
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Desempenho 1
Juliana F Camapum Wanderley
Objetivo: como ...
„
Medir e relatar
„
Fazer escolhas inteligentes
„
„
Ter um bom julgamento em avaliações de “marketing”.
„
Entender relação entre desempenho e arquitetura.
Medidas de desempenho – difícil
„
Impossível de julgar pela análise do conjunto de instruções.
„
Diferente métodos: diferente resultados.
„
„
É importante entender os critérios, para poder fazer escolhas
inteligentes.
Comparação entre máquinas é importante para
„
Compradores e Projetistas.
OAC – Desempenho 2
Juliana F Camapum Wanderley
1
Desempenho
„
Importância para projetistas:
„
„
„
Saber se uma máquina é mais rápida que a outra.
Saber porque isto acontece (hardware, set de instruções,
etc.).
Fatores que influenciam performance:
„
„
„
Quão bem o programa usa as instruções de máquina.
Quão bem o hardware implementa as instruções.
Quão bem os sistemas de I/O funcionam.
(i.e., Nós necessitamos de uma nova máquina ou um novo
sistema operacional?)
Juliana F Camapum Wanderley
OAC – Desempenho 3
Definindo desempenho
Analogia com aviões: qual avião tem o melhor desempenho?
Avião
Passageiros
Autonomia (mi)
Boeing 777
Boeing 747
BAC/Sud Concorde
Douglas DC-8-50
375
470
132
146
4630
4150
4000
8720
„
velocidade (mph)
610
610
1350
544
fluxo
(passxmph)
228750
286700
178200
079424
Concorde comparado com 747
„
Velocidade: Concorde é o melhor.
„
Capacidade: Boeing 747 é o melhor.
„
Velocidade de fluxo de passageiros: Boeing 747é o melhor para um maior número
de pessoas. Até 132 passageiros, o Concorde é o melhor.
„
Autonomia: o DC-8-50 é o melhor.
OAC – Desempenho 4
Juliana F Camapum Wanderley
2
Desempenho dos computadores: TIME,
TIME...
„
Tempo de Resposta (latência)
„
„
Dois computadores rodando um programa:
„
Qual deles roda o programa mais rápido?
„
Demora para executar uma tarefa
„
Espera de uma consulta a base de dados
Fluxo (Throughput)
„
Dois computadores rodando vários programas ao mesmo tempo:
„
Quantos trabalhos a máquina pode rodar cada vez?
„
Qual a taxa média de execução?
„
Quantos trabalhos são concluídos?
„
Se um novo processador é colocado na máquina o que nós melhoramos?
„
Se uma nova máquina é colocada no laboratório o que melhoramos?
OAC – Desempenho 5
Juliana F Camapum Wanderley
Tempo de Execução
„
Tempo de relógio, tempo de resposta ou tempo decorrido
„
„
„
Tempo total para uma tarefa incluindo acesso a disco,
memória...
Freqüentemente não é bom para comparações
Tempo de CPU
„
„
Não considera I/O ou tempo gasto por outros programas
Pode ser dividido em:
Tempo de CPU para usuário – tempo gasto no
programa
„ Tempo de CPU do sistema operacional – tempo gasto
pelo sistema op. em apoio ao programa
„ Difícil de separar estes tempos
„
Nosso foco: tempo de CPU para usuário
„ Desempenho de sistema: tempo decorrido
Juliana F Camapum Wanderley
OAC – Desempenho 6
„ Desempenho de CPU: tempo de CPU para usuário
„
3
Definições de Desempenho
„
Sempre usa um programa de teste
„
Uma máquina X rodando determinado programa
Performance x =
„
1
Tempo de Execução x
Se X é n vezes mais rápido que Y
Performance X Tempo de Execução Y
=
=n
Performance Y Tempo de Execução X
„
Problema:
„
máquina A roda um programa em 10 ms e máquina B roda o mesmo
programa em 20 ms
„
DesempenhoA=1/10ms=100, DesempenhoB=1/20ms=50
Juliana F Camapum Wanderley
OAC – Desempenho 7
Ciclos de Clock
„
Clock (relógio): usado em quase todos os computadores
„
„
Período = duração do ciclo de clock (segundos), freqüência=ciclos por
segundo = 1/período (Hertz)
Podemos usar no lugar do tempo de execução do programa
em segundos o número de ciclos
no. de ciclos de clock =
„
„
Tempo de CPU
= Tempo de CPU × f clock
duração do ciclo de clock
Para melhorar:
„
Reduzir período do clock
„
Reduzir número médio de ciclos por instrução
Será visto que muitas vezes…
„
Redução do período de clock →aumento no no médio de ciclos.
OAC – Desempenho 8
Juliana F Camapum Wanderley
4
Exemplo
„
Num programa de referência
Máquina A (clock de 400MHz) – TempoCPU=10 segundos
Máquina B (clock de ?) – TempoCPU= 6 segundos
Qual será o novo clock necessário?
Solução – usar a equação
„
„
„
„
no. de ciclos de clock da CPU = Tempo de CPU × f clock
„
Outra equação de medida
Programa → várias instruções
Cada instrução → ≠ no de ciclos
CPI – média de ciclos por instrução
Equação alternativa:
„
„
„
„
No de ciclos de clock da CPU = Instruções por programa x CPI
OAC – Desempenho 9
Juliana F Camapum Wanderley
Exemplo: duas máquinas
„
tem duas implementações de uma mesma instruction
set architecture (ISA) (mesmo conjunto de instruções)
„
Máquina A:
CLOCK:1ns
„ CPI: 2,0
„
„
Máquina B:
CLOCK: 1,2ns
„ CPI:1,2
„
„
„
„
Qual é a máquina mais rápida para este programa?
Quão mais rápida?
Solução
Determinar tempo de CPU
„ Usar 10
equação do desempenho
OAC – Desempenho
„
Juliana F Camapum Wanderley
5
Quantos ciclos são requeridos em um
programa?
...
6th
5th
4th
3rd instruction
1st instruction
2nd instruction
Poderíamos assumir que # de ciclos = # de instruções
„
time
„
„
Esta afirmação é incorreta, instruções gastam tempos
diferentes em máquinas diferentes.
Como? lembrem -se que são instruções de máquina e não
linhas de código C
Juliana F Camapum Wanderley
OAC – Desempenho 11
Diferentes números de ciclos para
diferentes instruções
time
„
„
„
Multiplicação gasta mais tempo que adição
Operações de ponto flutuante são mais longas
que inteiros
Acesso a memória gasta mais tempo que acesso a
registro
OAC – Desempenho 12
Juliana F Camapum Wanderley
6
Exemplo
„
„
„
„
Nosso programa roda em 10 segundos em um computador
A, que tem um clock de 400 Mhz.
Nós estamos ajudando alguém projetar uma nova máquina
B, que deverá rodar este programa em 6 segundos.
O projetista poderá usar uma nova (ou mais cara)
tecnologia para melhorar substancialmente a freqüência de
clock, mas ele tem a informação de que este aumento
afetará o projeto do resto da CPU e por essa razão a
máquina B requer 1,2 vezes mais ciclos de clock que a
máquina A para um mesmo programa.
Qual deverá ser a freqüência do clock da nova máquina?
OAC – Desempenho 13
Juliana F Camapum Wanderley
Depois de entender ciclos
„
„
Um dado programa requer
„
várias instruções (instruções de máquina )
„
vários ciclos
„
vários segundos
Nós temos um vocabulário que relaciona estas grandezas:
„
tempo de ciclo ou período (segundos por ciclo)
„
Freqüência do clock (ciclos por segundo)
„
CPI (ciclos por instrução)
uma aplicação intensiva em ponto flutuante poderia ter um alto CPI
„
MIPS (milhões de instruções por segundo)
poderia ser bom para um programa usando instruções simples
OAC – Desempenho 14
Juliana F Camapum Wanderley
7
Desempenho
„
„
Desempenho é determinado pelo tempo de execução
Como podemos quantificar o desempenho?
# de ciclos para executar um programa
# de instruções no programa
# de ciclos por segundo
média # de ciclos por instrução
Média # de instruções por segundo
„
„
„
„
„
Tempo de CPU =
„
no. de ciclos de clock no. de instruções × CPI
=
f clock
f clock
Erro comum: indicar uma das variáveis como desempenho quando ela realmente
não é.
Juliana F Camapum Wanderley
OAC – Desempenho 15
Equação alternativa
n
no. de ciclos de clock =
∑ CPI × C
i
i
i =1
„
„
„
Onde: CPIi = CPI para instruções de cada classe i
Ci = número de instruções de cada classe i
Exemplo: Um projetista de compilador decidindo entre duas
seqüências de código para uma máquina particular.
Baseado no Hardware da máquina
Classe da Instrução
CPI
A
B
C
1
2
3
Seqüência
1
2
Número de instruções
A
2
4
B
1
1
C
2
1
Qual a seqüência mais rápida? Quanto? Qual o CPI de cada seqüência?
OAC – Desempenho 16
Juliana F Camapum Wanderley
8
MIPS - Exemplo
„
Dois diferentes compiladores estão sendo testados para uma
máquina de 100 MHz. A máquina tem três diferentes classes de
instruções: Classe A, Classe B e Classe C, que requer um, dois e
três ciclos respectivamente. Os compiladores são usados para
produzir um grande bloco de software.
O código do primeiro compilador usa 5 milhões de instruções da classe A, 1
milhão da classe B e 1 milhão da classe C.
„
O código do segundo compilador usa 10 milhões de instruções da classe A, 1
milhão da classe B e 1 milhão da classe C.
„
Qual a seqüência mais rápida de acordo com MIPS?
„
Qual a seqüência mais rápida de acordo com tempo de
execução?
„
OAC – Desempenho 17
Juliana F Camapum Wanderley
Escolha de programas para avaliar
performance
„
Performance de vários computadores:
„
„
„
Comparação de cada um com um computador de referência.
Problema: Performance depende do programa.
Qual é o melhor programa?
„
Conjunto de programas típicos que o usuário tem contato:
„
Pode depender do usuário.
„
„
Programas de avaliação: “benchmarks”
„
„
„
Engenheiros, Programadores, Público em geral.
Problemas: algumas arquiteturas podem tentar melhorar desempenho nas
benchmarks, sem melhorar o desempenho em geral.
Exemplo: SPEC suite, 1989: Matrix300 - Referência: VAX-11/780
Melhor: programas reais.
„
Entretanto: às vezes se usa programas pequenos, especialmente em
começo de desenvolvimento, quando ainda não existem muitos
programas.
OAC – Desempenho 18
Juliana F Camapum Wanderley
9
SPEC89 (System Performance Evaluation Cooperative)
„
Índice para performance da máquina IBM Powerstation 550
800
700
SPEC performance ratio
600
500
400
300
200
100
0
g cc
e sp re s so
s p ic e
do d u c
n a sa 7
li
B e n ch m a r k
e q n to tt
ma tr ix3 00
fp p p p
to m c a tv
Co m p i le r
E n h a n ce d co m p il er
OAC – Desempenho 19
Juliana F Camapum Wanderley
Documentação
„
„
Incluir todos os detalhes (máquina, compilador, programas,
S.O., etc.).
Exemplo:
OAC – Desempenho 20
Juliana F Camapum Wanderley
10
Comparação
„
„
„
„
„
Definir um grupo de benchmarks.
Decidir: tempo ou fluxo.
Melhor: uma avaliação para cada.
Mas: pessoas muitas vezes preferem uma soma, média aritmética ou
ponderada do tempo de execução.
Exemplo:
„
Comparação individual
„
„
„
Programa 1: B é 10 vezes mais rápido que A.
Programa 2: A é 10 vezes mais rápido que B.
Total
Performance B TempoA 1001
=
=
= 9,1
Performance A TempoB 110
OAC – Desempenho 21
Juliana F Camapum Wanderley
Benchmark mais popular
„
SPEC’95 – aplicada a processadores recentes
„
Criadores: grupo de companhias
„
Método
„
„
Comparação: SPARCstation 10/40
Divide tempo da SPARCstation pelo tempo do computador
que está sendo avaliado
„
8 programas inteiros, 10 de ponto flutuante
„
Desempenho de cada um é reportado
„
Média usada: geométrica
OAC – Desempenho 22
Juliana F Camapum Wanderley
11
SPEC 95 – grupo de programas
Benchmark
go
m88ksim
gcc
compress
li
ijpeg
perl
vortex
tomcatv
swim
su2cor
hydro2d
mgrid
applu
trub3d
apsi
fpppp
wave5
Description
Artificial intelligence; plays the game of Go
Motorola 88k chip simulator; runs test program
The Gnu C compiler generating SPARC code
Compresses and decompresses file in memory
Lisp interpreter
Graphic compression and decompression
Manipulates strings and prime numbers in the special-purpose programming language Perl
A database program
A mesh generation program
Shallow water model with 513 x 513 grid
quantum physics; Monte Carlo simulation
Astrophysics; Hydrodynamic Naiver Stokes equations
Multigrid solver in 3-D potential field
Parabolic/elliptic partial differential equations
Simulates isotropic, homogeneous turbulence in a cube
Solves problems regarding temperature, wind velocity, and distribution of pollutant
Quantum chemistry
Plasma physics; electromagnetic particle simulation
Juliana F Camapum Wanderley
OAC – Desempenho 23
SPEC 95 – exemplo Pentium e Pentium Pro
„
10
10
9
9
8
8
7
7
6
6
SPECfp
SPECint
„
Dobrando a taxa de clock dobra o desempenho?
Uma máquina com uma freqüência de clock menor pode ter melhor
desempenho?
5
4
5
4
3
3
2
2
1
1
0
0
50
100
150
Clock rate (MHz)
Pentium Pro: 1,4 a 1,5 x mais rápido
OAC – Desempenho 24
200
250
Pentium
Pentium Pro
50
100
150
200
250
Clock rate (MHz)
Pentium Pro: 1,7 a 1,8 x mais rápido
Pentium
Pentium Pro
Juliana F Camapum Wanderley
12
Lei de Amdahl
„
„
„
Perigo: Esperar que uma melhoria aumente o desempenho da
máquina de forma proporcional ao tamanho da melhoria
Tempo de execução após melhoria = Tempo de execução não
afetado + (Tempo de execução afetado / melhoria )
Falha: Uso do parâmetro MIPS como métrica da performance
„
„
Diferentes máquinas possuem diferentes quantidade de instruções para
executar o mesmo programa
Princípio: Faça o caso comum mais rápido – são mais simples
de otimizar
OAC – Desempenho 25
Juliana F Camapum Wanderley
Exemplo
„
„
„
Suponha que todas as instruções em ponto flutuante
sejam melhoradas rodando 5 vezes mais rápido.
Se o tempo de execução de alguns benchmark antes da
melhora no ponto flutuante é de 10 segundos.
Qual será o aumento da velocidade se metade dos 10
segundos são gastos executando instruções em ponto
flutuante?
OAC – Desempenho 26
Juliana F Camapum Wanderley
13
Exemplo
Nós estamos procurando um benchmark para
demonstrar a nova unidade de ponto flutuante descrita
acima, e queremos que o benchmark tenha um
aumento de velocidade de 3.
Considerando um benchmark que tem um tempo de
execução de 100 segundos com o hardware antigo de
ponto flutuante.
Quanto do tempo de execução deve ser gasto com
instruções em ponto flutuante para que o benchmark
tenha o aumento de velocidade desejado?
„
„
„
OAC – Desempenho 27
Juliana F Camapum Wanderley
Relembrando
„
„
„
Desempenho é específico para um programa particular
Tempo total de execução é um resumo consistente do
desempenho
Para uma dada arquitetura o desempenho aumenta
quando:
„
„
„
„
Aumento da freqüência de clock (sem efeitos adversos no CPI)
Melhorias na organização do processador que diminuam o CPI
Melhorias no compilador que diminuam o CPI e/ou número de
instruções
Falha: Melhorias de desempenho em um aspecto da
máquina afetará o desempenho total
OAC – Desempenho 28
Juliana F Camapum Wanderley
14
• aumento do clock: 21 vezes (66 a 1400Mhz) – aumento da performance = 55 vezes
• Intel P4 1900 e AMD Athlon 1400 são aproximadamente iguais na adição com inteiros
OAC – Desempenho 29
Juliana F Camapum Wanderley
• AMD K6-2 350 x PII 333: O AMD tem um clock 5% mais alto porém ele é 36% mais lento.
• Althon: 10% mais cálculos do que o Intel Pentium III rodando na mesma freqüência.
• Pentium 4 1400 não atendeu as expectativas. Pentium 4 1900 mostrou um desempenho razoável.
OAC – Desempenho 30
Juliana F Camapum Wanderley
15
• Instruções MMX foram introduzidas pela Intel com a CPU Pentium166
• O Pentium 4 teve um baixo desempenho para cálculos MMX (Surpresa!!!)
• MMX (MultiMedia eXtension) – na realidade não aumenta a funcionalidade do processamento Multimedia como foi anunciado
• As instruções utilizam operações lógicas e matemáticas – processa dados maiores (64 bits) em um tempo menor
• Processa vários blocos inteiros simultaneamente por uma única CPU
• Difícil de usar – poucos aplicativos usam todos os benefícios das instruções MMX
OAC – Desempenho 31
Juliana F Camapum Wanderley
WinChip C6 X Pentium
A Intel aumentou o tamanho da memória cache L1 (cache interno) do Pentium de 16 KB para 32 KB no Pentium MMX.
Só isto faz com que o Pentium MMX seja mais rápido que um Pentium não-MMX.
Programas que não possuem instruções MMX: ganho de performance médio do Pentium-200 MMX sobreo Pentium-200 é de 11,30%
Programas que possuem instruções MMX: ganho de performance médio do Pentium-200 MMX sobre o Pentium-200 é de 239%
São poucos os programas que utilizam instruções MMX. Um programa conhecido que já possui versão MMX é o PhotoShop.
OAC – Desempenho 32
Juliana F Camapum Wanderley
16
Pentium 4 (MMX, SSE, SSE2) x Athlon (MMX, 3DNow)
MP3 encoding
Windows 2000
FPU intensive
OAC – Desempenho 33
Juliana F Camapum Wanderley
VAX – arquitetura CISC , MIPS – arquitetura RISC
OAC – Desempenho 34
Juliana F Camapum Wanderley
17
RISC x CISC
„
„
„
„
„
RISC sobre CISC
„ Instruções Load/Store – um ciclo (mais rápida)
„ Controle por conexões físicas (fiação); complexidade reduzida
do chip
„ Hardware mais simples, mais fácil de projetar e mais barato
para produzir
„ Mais registradores/menor acesso a MEMÓRIA
„ INSTRUÇÕES com formato fixo, menor número de instruções
„ Mais fácil de projetar compiladores otimizados
„ Software mais complexo, programas maiores
CISC: 75% do mercado (Intel, AMD, padrão x86)
PowerPC 601 (RISC) mais instruções do que o Pentium (CISC)
CISC atuais usam muitas técnicas do RISC
As diferenças estão diminuindo
OAC – Desempenho 35
Juliana F Camapum Wanderley
Sobre o MIPS e VAX
„
Fortes similaridades organizacionais
„
„
„
„
„
Ex: Abstrações do Pipeline da CPU se encaixam
VAX microinstruções possui muitas
características do RISC
MIPS possui Int-Cache e Data-Cache - VAX
tem uma única Cache com Inst+Data
MIPS tem páginas maiores (MEM)
MIPS tem acesso mais rápido a MEM,
operações em FP (ponto flutuante)
OAC – Desempenho 36
Juliana F Camapum Wanderley
18
Spec Benchmarks usados para MIPS/VAX
„
3 benchmarks inteiros (em C)
Espresso
ƒ Eqntott
ƒ Li
„
„
Compiladores usados: VAX Cv3.1,
CCv2.0
7 benchmarks ponto flutuante (em fortran )
„
ƒ
ƒ
ƒ
ƒ
ƒ
Spice2g6
Matrix300
Nasa7
Fpppp
Tomcatv
doduc
Compiladores usados: VAX Fortran
V5.0-1, MIPS f77 v2.0
Juliana F Camapum Wanderley
OAC – Desempenho 37
Instruções e CPI (Fator RISC)
MIPS/VAXINST
OAC – Desempenho 38
VAX/MIPSCPI
(CPI × INST) VAX
MIPS
VAX
=
=
VAX DESEMP (CPI × INST) MIPS MIPS CPI
MIPS/VAXDESEMP
MIPS
VAX INST
Juliana F Camapum Wanderley
19
MIPS/VAX – Performance e Instruções
OAC – Desempenho 39
Juliana F Camapum Wanderley
20
Organização e Arquitetura de Computadores
Aula 3 – Linguagem de Máquina
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Linguagem de Máquina 1
Juliana F Camapum Wanderley
Introdução
„
Linguagem de Máquina
„
„
„
„
„
Objetivos
„
„
„
„
Conjunto de Instruções
Variáveis em Assembly: Registradores
Adição e Subtração em Assembly
Acesso à Memória em Assembly
Facilitar a construção do hardware e compiladores
Maximizar a performance.
Minimizar o custo.
Instruções: MIPS (NEC, Nintendo, Silicon Graphics,
Sony).
OAC – Linguagem de Máquina 2
Juliana F Camapum Wanderley
1
Projeto de Assembly: Conceitos Chaves
„
„
Linguagem Assembly é essencialmente suportada
diretamente em hardware, portanto ...
Princípio 1: Simplicidade favorece Regularidade.
„
Ela é mantida bem simples!
„
Limite nos tipos de operandos
„
Limite no conjunto de operações que podem ser feitas
no mínimo absoluto
„
Se uma operação pode ser decomposta em uma mais simples,
não a inclua (a complexa)
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina 3
Todo computador: ops. Aritméticas
„
MIPS:
„
„
nota: os nomes reais dos operadores não são a, b e c. Serão vistos em Breve.
MIPS: sempre 3 operandos.
Exemplo: somar variáveis b, c, d, e, colocando a soma em a:
add a,b,c
add a,a,d
add a,a,e
„
„
# a←b+c
Instruções são mais rígidas que em lin. de alto nível
„
„
add a,b,c
# a → b+c
# a → b+c+d
# a → b+c+d+e
Símbolo # →
Comentário (até o fim da linha).
Exemplo: C → Assembly.
a = b + c;
d = a – e;
„
Em MIPS:
add a,b,c
sub d,a,e
OAC – Linguagem de Máquina 4
# a=b+c
# d=a-e
Juliana F Camapum Wanderley
2
Variáveis Assembly: Registradores (1/3)
„
Diferente de LAN, assembly não pode usar
variáveis.
„
„
Operandos Assembly são registradores
„
„
„
Por que não? Manter o Hardware simples
Número limitado de localizações especiais
construídas diretamente no hardware
Operações podem somente ser realizadas nestes!
Benefício: Como registradores estão diretamente
no hardware, eles são muito rápidos.
OAC – Linguagem de Máquina 5
Juliana F Camapum Wanderley
Variáveis Assembly: Registradores (2/3)
„
Desvantagem: Como registradores estão em hardware,
existe um número predeterminado deles.
„
„
„
Solução: código MIPS deve ser muito cuidadosamente
produzido para usar eficientemente os registradores.
32 registradores no MIPS
„
Por que 32?
„
Princípio 2: Menor é mais rápido (> no. reg → > ciclo clock)
Cada registrador MIPS tem 32 bits de largura
„
Grupos de 32 bits chamados uma palavra (word) no MIPS
OAC – Linguagem de Máquina 6
Juliana F Camapum Wanderley
3
Variáveis Assembly: Registradores (3/3)
„
„
Registradores são numerados de 0 a 31
Cada registrador pode ser referenciado por número ou
nome.
„
„
Por convenção, cada registrador tem um nome para facilitar a
codificação - nomes: iniciam em “$”
Por agora:
$16 - $22 
$8 - $15
„

$s0 - $s7 (corresponde a variáveis C)
$t0 - $t7 (corresponde a registradores temporários)
Em geral, utilize nomes de registradores para tornar o
código mais fácil de ler.
OAC – Linguagem de Máquina 7
Juliana F Camapum Wanderley
Comentários em Assembly
„
„
Outro modo de tornar o seu código mais
claro: comente!
Hash (#) é utilizado para comentários MIPS
„
„
Qualquer coisa da marca hash (#) ao final da
linha é um comentário e será ignorado.
Nota: Diferente do C.
„
Comentários em C tem a forma /* comentário */,
de modo que podem ocupar várias linhas.
OAC – Linguagem de Máquina 8
Juliana F Camapum Wanderley
4
Instruções Assembly
„
„
Em linguagem assembly, cada declaração
(chamada uma Instruction), executa
exatamente uma de uma lista pequena de
comandos simples
Diferente de C (e da maioria das outras
linguagem de alto nível), onde cada linha pode
representar múltiplas operações.
OAC – Linguagem de Máquina 9
Juliana F Camapum Wanderley
Adição e Subtração (1/3)
„
Sintaxe de Instruções:
1 2,3,4
onde:
1) operação por nome
2) operando recebendo o resultado ("destino")
3) 1o operando da operação ("fonte 1")
4) 2o operando da operação ("fonte 2")
„
Sintaxe é rígida:
„
1 operador, 3 operandos
„
Por quê? Manter o Hardware simples via regularidade
OAC – Linguagem de Máquina 10
Juliana F Camapum Wanderley
5
Adição e Subtração (2/3)
„
em C: f = (g + h) – (i + j);
„
Adição em Assembly (MIPS)
„
add
$t0,$s1,$s2
# t0=s1+s2=(g + h)
„
add
$t1,$s3,$s4
# t1=s3+s4=(i + j)
„
„
„
Reg. Temporários: $t0,$t1
Variáveis $s1,$s2,$s3,$s4 estão associados com
as variáveis g,h,i,j
Subtração em Assembly
„
sub
$s0,$t0,$t1
# s0=t0-t1=(g + h)-(i + j)
„
Reg. Temporários: $t0,$t1
„
Variável $s0 está associada com a variável
f
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina 11
Adição e Subtração (3/3)
„
„
Como fazer a seguinte declaração C?
a = b + c + d - e;
Quebre em múltiplas instruções
add $s0, $s1, $s2 # a = b + c
add $s0, $s0, $s3 # a = a + d
sub $s0, $s0, $s4 # a = a - e
„
„
Nota: Uma linha de C pode resultar em várias
linhas de MIPS.
Note: Qualquer coisa após a marca hash em
cada linha é ignorado (comentários)
OAC – Linguagem de Máquina 12
Juliana F Camapum Wanderley
6
Operandos Assembly: Memória
„
„
„
„
Variáveis C mapeiam em registradores; e como ficam as
grandes estruturas de dados, como arrays/vetores?
A memória (1 dos 5 componentes de um computador)
contém tais estruturas.
Mas as instruções aritméticas MIPS somente operam
sobre registradores, nunca diretamente sobre a
memória.
Instruções para transferência de dados transferem
dados entre os registradores e a memória:
„
Memória para registrador
„
Registrador para memória
OAC – Linguagem de Máquina 13
Juliana F Camapum Wanderley
Endereçamento: Byte vs. palavra (1/2)
„
„
Cada palavra na memória tem um endereço, similar a
um índice em um array.
Primeiros computadores numeravam palavras como
elementos de um array C:
„ Memory[0], Memory[1], Memory[2], 
Chamado o "endereço" de uma palavra
„
„
Computadores precisam acessar bytes (8-bits) bem
como palavras (4 bytes/palavra)
Máquinas de hoje endereçam memória como bytes,
portanto endereços de palavra diferem por 4
„
Memory[0], Memory[4], Memory[8], 
OAC – Linguagem de Máquina 14
Juliana F Camapum Wanderley
7
Endereçamento: Byte vs. palavra (2/2)
Endereçamento Byte
Endereçamento Palavra
OAC – Linguagem de Máquina 15
Juliana F Camapum Wanderley
Transferência de Dados: Memória para Reg. (1/4)
„
Para transferir uma palavra de dados, nós
devemos especificar duas coisas:
„
Registrador: especifique este pelo número (0 - 31)
„
Endereço da memória: mais difícil
„
„
Pense a memória como um array único uni-dimensional,
de modo que nós podemos endereçá-la simplesmente
fornecendo um ponteiro para um endereço da memória.
Outras vezes, nós queremos ser capazes de deslocar a
partir deste ponteiro.
OAC – Linguagem de Máquina 16
Juliana F Camapum Wanderley
8
Transferência de Dados: Memória para Reg (2/4)
„
Para especificar um endereço de memória para
copiar dele, especifique duas coisas:
„
„
„
„
Um registrador que contém um ponteiro para a
memória.
Um deslocamento numérico (em bytes)
O endereço de memória desejado é a soma
destes dois valores.
Exemplo:
„
8($t0)
Especifica o endereço de memória apontado pelo
valor em $t0, mais 8 bytes
OAC – Linguagem de Máquina 17
Juliana F Camapum Wanderley
Transferência de Dados: Memória para Reg (3/4)
„
Sintaxe da instrução de carga (load):
1
„
2,3(4)
onde
1) nome da operação (instrução)
2) registrador que receberá o valor
3) deslocamento numérico em bytes.
4) registrador contendo o ponteiro para a memória
„
Nome da Instrução:
„
lw (significa Load Word, logo 32 bits ou uma palavra
é carregada por vez)
OAC – Linguagem de Máquina 18
Juliana F Camapum Wanderley
9
Transferência de Dados: Memória para Reg.(4/4)
„
Exemplo:
Esta instrução pegará o ponteiro em $s0, soma 12
bytes a ele, e então carrega o valor da memória
apontado por esta soma calculada no registrador $t0
„
„
lw $t0,12($s0)
Notas:
„
$s0 é chamado registrador base
„
12 é chamado deslocamento (offset)
Deslocamento é geralmente utilizado no acesso de
elementos de array ou estruturas: reg base aponta
para o início do array ou estrutura.
„
OAC – Linguagem de Máquina 19
Juliana F Camapum Wanderley
Compilação com Memória
„
Qual o offset em lw para selecionar A[8] em C?
„
„
Compile manualmente usando registradores:
g = h + A[8];
„
„
g: $s1, h: $s2, $s3: endereço base de A
1o transfere da memória para registrador:
„ lw
$t0,32($s3)
# $t0 = A[8]
„
„
4x8=32 para selecionar A[8]: byte vs. palavra
Some 32 a $s3 para selecionar A[8], põe em $t0
A seguir, some-o a h e coloque em g
add $s1,$s2,$t0
# $s1 = h+A[8]=$s2+$t0
OAC – Linguagem de Máquina 20
Juliana F Camapum Wanderley
10
Transferência de Dados: Reg para Memória
„
Também queremos armazenar um valor do registrador na
memória.
„
Sintaxe da instrução store é idêntica à da instrução load.
„
Nome da Instrução:
„
„
sw (significa Store Word, logo 32 bits ou uma palavra será
carregada por vez)
Exemplo:
„
sw $t0,12($s0)
Esta instrução tomará o ponteiro em $s0, somará 12
bytes a ele, e então armazenará o valor do registrador
$t0 no endereço de memória apontado pela soma
calculada.
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina 21
Exemplo: Compilar ...
„
Compile manualmente usando registradores:
A[12] = h + A[8];
„
„
h: $s2, $s3: endereço base de A
1o transfere da memória para registrador $t0:
lw $t0,32($s3)
„
„
# $t0 = A[8]
2o some-o a h e coloque em $t0
add $t0,$s2,$t0 # $t0 = h+A[8]
3o transfere do reg. $t0 para a memória :
sw $t0,48($s3)
# A[12] = $t0
OAC – Linguagem de Máquina 22
Juliana F Camapum Wanderley
11
Ponteiros vs. Valores
„
„
„
Conceito Chave: Um registrador pode conter
qualquer valor de 32 bits. Este valor pode ser um
int (signed), um unsigned int, um ponteiro
(endereço de memória), etc.
Se você escreve lw $t2,0($t0) então é
melhor que $t0 contenha um ponteiro.
E se você escrever add $t2,$t1,$t0 então
$t0 e $t1 devem conter o quê?
OAC – Linguagem de Máquina 23
Juliana F Camapum Wanderley
Notas a cerca da Memória
„
Falha: Esquecer que endereços seqüenciais de
palavras em máquinas com endereçamento de
byte não diferem por 1.
„
„
Muitos erros são cometidos por programadores de
linguagem assembly por assumirem que o endereço
da próxima palavra pode ser achado incrementandose o endereço em um registrador por 1 ao invés do
tamanho da palavra em bytes.
Logo, lembre-se que tanto para lw e sw, a soma do
endereço base e o offset deve ser um múltiplo de 4
(para ser alinhado em palavra)
OAC – Linguagem de Máquina 24
Juliana F Camapum Wanderley
12
Mais Notas acerca da Memória: Alinhamento
MIPS requer que todas as palavras comecem em
endereços que são múltiplos de 4 bytes.
„
Bytes na Palavra
0
1
2
3
Alinhado
Não
Alinhado
„
Localização da Palavra
Chamado Alinhamento: objetos devem cair em
endereços que são múltiplos do seu tamanho.
OAC – Linguagem de Máquina 25
Juliana F Camapum Wanderley
Papel dos Registradores vs. Memória
„
„
E se temos mais variáveis do que registradores?
„ Compilador tenta manter as variáveis mais
freqüentemente utilizadas nos registradores.
„ Escrevendo as menos comuns na memória: spilling
Por que não manter todas as variáveis na memória?
„ Menor é mais rápido:
registradores são mais rápidos que a memória
„ Registradores são mais versáteis:
„
„
Instruções aritméticas MIPS pode ler 2, operar sobre eles
e escrever 1 por instrução
Transferência de dados MIPS somente lê ou grava 1
operando por instrução, sem nenhuma operação.
OAC – Linguagem de Máquina 26
Juliana F Camapum Wanderley
13
Imediatos
„
„
„
Imediatos são constantes numéricas.
Eles aparecem freqüentemente em código, logo existem
instruções especiais para eles.
Somar Imediato:
addi $s0,$s1,10 #$s0=$s1+10(em MIPS)
f = g + 10 (em C)
„
„
onde registradores $s0,$s1 estão associados com as
variáveis f, g
Sintaxe similar à instrução add exceto que o último
argumento é um número ao invés de um registrador.
OAC – Linguagem de Máquina 27
Juliana F Camapum Wanderley
Registrador Zero
„
„
„
Um imediato particular, o número zero (0), aparece
muito freqüentemente em código.
Então nós definimos o registrador zero ($0 ou $zero)
para sempre ter o valor 0.
Isto é definido em hardware, de modo que uma
instrução como:
addi $0,$0,5 #$0=$0+5 → $0=0(reg. $0=0 sempre)
não vai fazer nada.
„
Use este registrador, ele é muito prático!
OAC – Linguagem de Máquina 28
Juliana F Camapum Wanderley
14
"Em conclusão ..." (1/2)
„
„
„
Em linguagem Assembly MIPS:
„
Registradores substituem variáveis C
„
Uma instrução (operação simples) por linha
„
Mais Simples é Melhor
„
Menor é Mais Rápido
Memória é endereçada por byte, mas lw e sw acessam
uma palavra de cada vez.
Um ponteiro (usado por lw e sw) é simplesmente um
endereço de memória, logo nós podemos somar a ele
ou subtrair dele (usando offset).
OAC – Linguagem de Máquina 29
Juliana F Camapum Wanderley
"E em conclusão..." (2/2)
„
„
Novas Instruções:
„
add, addi,
„
sub
„
lw, sw
Novos registradores:
„
Variáveis C: $s0 - $s7
„
Variáveis Temporárias: $t0 - $t9
„
Zero: $zero
OAC – Linguagem de Máquina 30
Juliana F Camapum Wanderley
15
Linguagem de Máquina
„
„
Instruções, como registradores e palavras, são de 32 bits
„ Exemplo:
add $t0, $s1, $s2
„ registradores tem números t0=reg.8,$s1=reg.17,$s2=reg.18
Formato de Instrução de soma com registradores (R-tipo):
0
17
000000 10001
op
rs
6 bits
„
„
„
„
„
5 bits
18
8
10010
rt
01000
rd
5 bits
5 bits
0
32
00000 100000
shamt funct
5 bits
6 bits
Primeiro campo: tipo de operação (soma).
Último campo: modo da operação (soma com 2 registradores).
Segundo campo: primeira fonte (17=$s1).
Terceiro campo: segunda fonte (18=$s2).
Quarto campo: registrador de destino (8=$t0).
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina 31
Linguagem de Máquina
„
„
Novo princípio: Bom projeto exige um bom compromisso
„
Vários tipos de instruções (tipo-R, tipo-I)
„
Múltiplos formatos: complicam o hardware.
„
Manter os formatos similares (3 primeiros campos iguais).
Considere as instruções load-word e store-word,
„
„
I-tipo para instruções de transferência de dados (lw,sw)
Exemplo: lw $t0, 32($s2)
35
op
18
rs
8
rt
32
16 bit - offset
„
Registrador de base: rs $s2.
„
Registrador de fonte ou origem: rt $t0.
„
Endereço de 16 bits: offset entre ±215.
OAC – Linguagem de Máquina 32
Juliana F Camapum Wanderley
16
Codificação das instruções vistas até agora
„
Notar: add e sub:
„
Mesmo opcode: 0.
„
Diferente função: 32 e 34.
OAC – Linguagem de Máquina 33
Juliana F Camapum Wanderley
Exemplo
„
Tradução de C para assembly e linguagem de máquina.
„
„
„
C: A[300] = h + A[300]
Assembly:
lw $t0,1200($t1)
add $t0,$s2, $t0
sw $t0,1200($t1)
# $t1=end. base=A
# $t0= A[300]=conteúdo(1200+$t1)
# $t0=$t0+$s2=A[300]+h
# A[300]=$t0
Linguagem de máquina:
“simplicidade favorece
regularidade”
1 bit de
diferença
OAC – Linguagem de Máquina 34
Juliana F Camapum Wanderley
17
Computadores modernos
„
Instruções são representadas como números.
„
Programas podem ser armazenados na memória.
„
Conceito de programa armazenado.
„
Programa armazenado: Na memória...
„
Programa de contabilidade.
„
Editor.
„
Compilador.
„
Dados.
„
Texto.
„
Programa em C.
OAC – Linguagem de Máquina 35
Juliana F Camapum Wanderley
Resumo da linguagem até agora
OAC – Linguagem de Máquina 36
Juliana F Camapum Wanderley
18
Organização e Arquitetura de Computadores
Aula 4 – Linguagem de Máquina - Decisões
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Linguagem de Máquina - Decisões - 1
Juliana F Camapum Wanderley
Revisão (1/2)
„
„
„
Em Linguagem Assembly MIPS:
„
Registradores substituem variáveis C
„
Uma Instrução (operação simples) por linha
„
Mais simples é Melhor
„
Menor é Mais Rápido
Memória é endereçada por byte, mas lw e sw acessam
uma palavra por vez
Um ponteiro (usado por lw e sw) é simplesmente um
endereço de memória, de modo que podemos adicionar
a ele ou subtrair dele (utilizando offset).
OAC – Linguagem de Máquina - Decisões - 2
Juliana F Camapum Wanderley
1
Revisão (2/2)
„
Novas Instruções:
„
„
add, addi, sub, lw, sw
Novos Registradores:
„
Variáveis C: $s0 - $s7
„
Variáveis Temporárias: $t0 - $t9
„
Zero: $zero
OAC – Linguagem de Máquina - Decisões - 3
Juliana F Camapum Wanderley
Panorama
„
„
Decisões C/Assembly : if, if-else
Laços (loops) C/Assembly: while, do while,
for
„
Desigualdades
„
Declaração Switch C
OAC – Linguagem de Máquina - Decisões - 4
Juliana F Camapum Wanderley
2
Até agora...
„
„
„
„
Todas as instruções nos permitiram manipular
dados.
Assim, construimos uma calculadora.
Para construirmos um computador, precisamos da
habilidade de tomar decisões...
Vamos lá: pegue papel e caneta porque vamos
fazer alguns exercícios na classe hoje!
OAC – Linguagem de Máquina - Decisões - 5
Juliana F Camapum Wanderley
Decisões em C: Declaração if
„
„
2 tipos de declaração if em C
„
if (condição) cláusula
„
if (condição) cláusula1 else cláusula2
Rearranje o 2o if do seguinte modo:
(condição) goto L1;
cláusula2;
if
go to L2;
L1:
cláusula1;
L2:
„
Não é tão elegante como if-else, mas com o mesmo significado
OAC – Linguagem de Máquina - Decisões - 6
Juliana F Camapum Wanderley
3
Instruções de Decisão MIPS
„
Instrução de Decisão em MIPS
„
beq
register1, register2, L1
„
beq é "branch if (registers are) equal“
O mesmo que (usando C): if (register1==register2)
goto L1
„
Instrução de decisão MIPS complementar
„
bne
register1, register2, L1
„
bne é "branch if (registers are) not equal
O mesmo que (usando C): if (register1!=register2)
goto L1
„
Chamados desvios condicionais
OAC – Linguagem de Máquina - Decisões - 7
Juliana F Camapum Wanderley
Instrução Goto MIPS
„
Além dos desvios condicionais, MIPS tem um desvio
incondicional:
„
„
„
Chamada instrução Pulo (Jump): pule (ou desvie) diretamente
para a marca dada sem precisar satisfazer qualquer condição
Mesmo significado (usando C):
„
„
J label
goto label
Tecnicamente, é o mesmo que:
„ beq $0,$0,label
„
já que sempre vai satisfazer a condição.
OAC – Linguagem de Máquina - Decisões - 8
Juliana F Camapum Wanderley
4
Compilando if C em MIPS (1/2)
„
Compile manualmente
if (i == j) f = g+h;
(true)
i == j
else f = g-h;
f=g+h
i == j?
(false)
i != j
f=g-h
Exit
„
Use este mapeamento:
f: $s0, g: $s1, h: $s2, i: $s3, j: $s4
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Decisões - 9
Compilando if C em MIPS (2/2)
„
Código final MIPS compilado
(preencha o espaço em branco):
(true)
i == j
i == j?
f=g+h
(false)
i != j
f=g-h
Exit
OAC – Linguagem de Máquina - Decisões - 10
Juliana F Camapum Wanderley
5
Compilando if C em MIPS (2/2)
„
Código MIPS final compilado:
beq $s3,$s4,True
# branch i==j
sub $s0,$s1,$s2
# (false) f=g-h
j
# go to Fim
Fim
True: add $s0,$s1,$s2
(true)
i == j
I == j?
f=g+h
(false)
i != j
f=g-h
Exit
# (true) f=g+h
Fim:
„
Nota:
„
Compilador automaticamente cria labels para tratar decisões (desvios)
apropriadamente. Geralmente não são encontrados no código da
Linguagem de Alto Nível
OAC – Linguagem de Máquina - Decisões - 11
Juliana F Camapum Wanderley
Laços (loops) em C/Assembly (1/3)
„
Laço (loop) simples em C
do
{
g = g + A[i];
i = i + j;
} while (i != h);
„
Reescreva isto como:
Loop:
„
g = g + A[i];
i = i + j;
if (i != h) goto Loop;
Use este mapeamento:
„
g: $s1, h: $s2, i: $s3, j: $s4, base de A:$s5
OAC – Linguagem de Máquina - Decisões - 12
Juliana F Camapum Wanderley
6
Loops em C/Assembly (2/3)
„
Código MIPS final compilado:
(preencha o espaço em branco):
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Decisões - 13
Laços (loops) em C/Assembly (2/3)
Código MIPS final compilado:
Loop:
„
add $t1,$s3,$s3
# $t1 = 2*i
add $t1,$t1,$t1
# $t1 = 4*i
add $t1,$t1,$s5
# $t1=end(A+4*i)
lw
# $t1=A[i]
$t1,0($t1)
add $s1,$s1,$t1
# g=g+A[i]
add $s3,$s3,$s4
# i=i+j
bne $s3,$s2,Loop # goto Loop if i!=h
OAC – Linguagem de Máquina - Decisões - 14
Juliana F Camapum Wanderley
7
Laços (loops) em C/Assembly (3/3)
„
„
„
Existem três tipos de laços em C:
„
while
„
do while
„
for
Cada um pode ser rescrito como um dos outros dois, de
modo que o método utilizado no exemplo anterior, pode ser
aplicado a laços while e for igualmente.
Conceito Chave: Apesar de haver muitas maneiras de se
escrever um loop em MIPS, desvio condicional é a chave
para se tomar decisões.
OAC – Linguagem de Máquina - Decisões - 15
Juliana F Camapum Wanderley
Laço com while em C/Assembly (1/2)
„
„
„
Laço (loop) simples em C
while (save[i] == k)
i = i + j;
Reescreva isto como:
Loop: if (save[i] != k) goto Exit;
i = i + j;
goto Loop;
Exit:
Use este mapeamento:
„
i: $s3, j: $s4, k: $s5, base de save :$s6
OAC – Linguagem de Máquina - Decisões - 16
Juliana F Camapum Wanderley
8
Loops em C/Assembly (2/2)
„
Código MIPS final compilado:
(preencha o espaço em branco):
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Decisões - 17
Laços (loops) em C/Assembly (2/2)
Código MIPS final compilado:
Loop:
„
add $t1,$s3,$s3
# $t1 = 2*i
add $t1,$t1,$t1
# $t1 = 4*i
add $t1,$t1,$s6
# $t1=end(save+4*i)
lw
# $t1=save[i]
$t1,0($t1)
bne $t1,$s5,Exit # goto Exit if save[i]!=k
add $s3,$s3,$s4
# i=i+j
j
# goto Loop
Loop
Exit:
OAC – Linguagem de Máquina - Decisões - 18
Juliana F Camapum Wanderley
9
Desigualdades em MIPS (1/5)
„
Até agora, nós testamos apenas igualdades (== e !=).
„
Programas gerais precisam testar > e < também.
„
Criar uma Instrução de Desigualdade em MIPS:
„
"Set on Less Than"
„
Sintaxe:
„
Significado:
slt reg1,reg2,reg3
if (reg2 < reg3) reg1 = 1;
else reg1 = 0;
„
Em computadores, "set" significa "set to 1", "reset" significa
"set to 0".
OAC – Linguagem de Máquina - Decisões - 19
Juliana F Camapum Wanderley
Desigualdades em MIPS (2/5)
„
Como nós utilizamos isto?
„
Compile manualmente:
if (g < h) goto Less;
„
Use este mapeamento:
g: $s0, h: $s1
OAC – Linguagem de Máquina - Decisões - 20
Juliana F Camapum Wanderley
10
Desigualdades em MIPS (3/5)
„
Código MIPS final compilado:
(preencha o espaço em branco):
OAC – Linguagem de Máquina - Decisões - 21
Juliana F Camapum Wanderley
Desigualdades em MIPS (3/5)
„
Código final MIPS compilado:
slt $t0,$s0,$s1 # $t0 = 1 if g<h
bne $t0,$0,Less # goto Less if $t0!=0
Less:
# (if (g<h))
„
Desvie se $t0 != 0  (g < h)
„
Registrador $0 sempre contém o valor 0, assim bne
e beq freqüentemente utilizam-no para comparação
após uma instrução slt.
OAC – Linguagem de Máquina - Decisões - 22
Juliana F Camapum Wanderley
11
Desigualdades em MIPS (4/5)
„
„
Agora, nós podemos implementar <, mas como
implementamos >, <= e >=?
Poderíamos adicionar mais 3 instruções mas:
„
„
Meta MIPS: Mais simples é Melhor
Nós podemos implementar <= em um ou mais
instruções utilizando apenas slt e os desvios?
„
E >?
„
E >=?
„
4 combinações de slt e beq/bne
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Decisões - 23
Desigualdades em MIPS (5/5)
„
4 combinações de slt e beq/bne:
slt $t0,$s0,$s1
# $t0 = 1 if g<h
bne $t0,$0,Less
# if(g<h) goto Less
slt $t0,$s1,$s0
# $t0 = 1 if g>h
bne $t0,$0,Greater # if(g>h) goto Greater
slt $t0,$s0,$s1
# $t0 = 1 if g<h
beq $t0,$0,Gteq
# if(g>=h) goto Gteq
slt $t0,$s1,$s0
# $t0 = 1 if g>h
beq $t0,$0,Lteq
# if(g<=h) goto Lteq
OAC – Linguagem de Máquina - Decisões - 24
Juliana F Camapum Wanderley
12
Imediatos em Desigualdades
„
Existe também uma versão com imediatos de slt para
testar contra constantes: slti
„
„
C
Útil em laços (loops) for
if (g >= 1) goto Loop
M
I
P
S
OAC – Linguagem de Máquina - Decisões - 25
Juliana F Camapum Wanderley
Comando Switch/Case
„
„
Novo instrumento: jr (jump register):
„
Salto incondicional.
„
Pula para o endereço especificado pelo registrador.
„
Geralmente é usada juntamente com uma tabela.
Para casa: estudar a instrução Switch/Case.
OAC – Linguagem de Máquina - Decisões - 26
Juliana F Camapum Wanderley
13
Organização e Arquitetura de Computadores
Aula 5 – Linguagem de Máquina - Funções
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Linguagem de Máquina - Funções - 1
Juliana F Camapum Wanderley
Procedimentos
„
Estruturação de programas.
„
Mais fácil de entender.
„
Reutilização.
„
Dividir em partes menores.
OAC – Linguagem de Máquina - Funções - 2
Juliana F Camapum Wanderley
1
Panorama
„
Funções em C
„
Instruções MIPS para Funções
„
A pilha (Stack)
„
Convenções de Registradores
„
Exemplo
OAC – Linguagem de Máquina - Funções - 3
Juliana F Camapum Wanderley
Funções em C
De quais informações o
main() {
compilador/programador
int i,j,k,m;
deve manter registro?
i = mult(j,k); ... ;
m = mult(i,i); ...
}
/* really dumb mult function */
int mult (int mcand, int mlier){
int product;
product = 0;
while (mlier > 0) {
product = product + mcand;
mlier = mlier -1; }
Quais instruções
return product;
podem realizar isto?
}
OAC – Linguagem de Máquina - Funções - 4
Juliana F Camapum Wanderley
2
Contabilidade de Chamada de Função
„
„
„
Registradores tem papel fundamental para manter
registro de informações nas chamadas de funções.
Convenção de Registradores:
„
Endereço de retorno
$ra
„
Argumentos
$a0, $a1, $a2, $a3
„
Valor de Retorno
$v0, $v1
„
Variáveis locais
$s0, $s1,  , $s7
A pilha também é utilizada.
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Funções - 5
Instruções de Suporte para Funções (1/4)
C
... sum(a,b);... /* a,b:$s0,$s1 */
}
int sum(int x, int y) {
return x+y;
}
M
I
P
S
endereço
1000
1004
1008
1012
1016 ...
add
add
addi
j
2000 sum:
add $v0,$a0,$a1
# função sum: x+y
2004
jr
# new instruction
$a0,$s0,$zero
$a1,$s1,$zero
$ra,$zero,1016
sum
$ra
OAC – Linguagem de Máquina - Funções - 6
# programa principal
# x = a
# y = b
#$ra=1016
#jump to sum
Juliana F Camapum Wanderley
3
Instruções de Suporte para Funções (2/4)
„
„
Instrução única para pular e salvar o endereço de
retorno: jump and link (jal)
Antes:
1008 addi $ra,$zero,1016 #$ra=1016
1012 j sum
#go to sum
„
Depois:
1008 jal sum
„
# $ra=1016,go to sum
Por que ter uma jal?
„
Torne o caso comum rápido: funções são muito
comuns.
OAC – Linguagem de Máquina - Funções - 7
Juliana F Camapum Wanderley
Instruções de Suporte para Funções (3/4)
„
Sintaxe de jal (jump and link) é a mesma de
j (jump):
„
„
jal label
jal deveria na verdade ser chamada laj de link
and jump:
„
„
Passo 1 (link): Salva o endereço da próxima
instrução em $ra (Por que a próxima instrução? Por
que não a corrente?)
Passo 2 (jump): Pule para o label dado
OAC – Linguagem de Máquina - Funções - 8
Juliana F Camapum Wanderley
4
Instruções de Suporte para Funções (4/4)
„
Sintaxe de jr (jump register):
„
„
„
„
jr
register
Ao invés de prover um label para pular para, a instrução jr provê
um registrador que contém um endereço para onde pular.
Útil somente se nós sabemos o endereço exato para
onde pular: raramente aplicável.
Muito útil para chamadas de funções:
„
jal guarda o endereço de retorno no registrador ($ra)
(chamada de uma função)
„
jr pula de volta para aquele endereço (retorno da função)
OAC – Linguagem de Máquina - Funções - 9
Juliana F Camapum Wanderley
Funções Aninhadas (1/2)
int sumSquare(int x, int y) {
return mult(x,x)+ y;
}
„
„
„
Alguma coisa chamada sumSquare, que chama mult.
Há um valor em $ra que sumSquare quer pular de volta,
mas será sobrescrito pela chamada a mult.
Precisa salvar o endereço de retorno de sumSquare
antes de chamar mult.
OAC – Linguagem de Máquina - Funções - 10
Juliana F Camapum Wanderley
5
Funções Aninhadas (2/2)
„
„
Em geral, pode ser necessário salvar algum outro
registrador além de $ra.
Quando um programa C está rodando, existem 3
importantes áreas de memória que são alocadas:
„
„
„
Static (alocação estática): Variáveis declaradas uma vez por
programa, deixam de existir somente quando a execução
termina.
Heap (alocação dinâmica): Variáveis declaradas
dinamicamente.
Stack (pilha): Espaço a ser utilizado pela função durante sua
execução; é aqui que podemos salvar os valores dos
registradores.
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Funções - 11
Alocação de Memória em C
Endereço
∞
$sp
stack
pointer
0
Stack
Espaço para informações
salvas pela função
Heap
Espaço explicitamente criado
e.g., malloc(); ponteiros C
Static
Variáveis declaradas
uma vez por programa
Code
Programa
OAC – Linguagem de Máquina - Funções - 12
Juliana F Camapum Wanderley
6
Usando a Pilha (1/2)
„
„
„
Nós temos um registrador $sp que sempre aponta
para o último espaço utilizado na pilha.
Para utilizar a pilha:
„
1o decrementamos o ponteiro $sp de 4 bytes
„
2o preenchemos os 4 bytes da pilha com a informação.
Então, como compilamos isto?
int sumSquare(int x, int y) {
return mult(x,x)+ y;}
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Funções - 13
Usando a Pilha (2/2)
„
Compile manualmente
sumSquare:
(salva end. retorno e argumento de SumSquare)
Função SumSquare
int sumSquare(int x, int y)
{
return mult(x,x)+ y;}
addi
$sp,$sp,-8
# reserva espaço na pilha
sw
sw
$ra, 4($sp)
$a1, 0($sp)
# salva reg. end. retorno
# salvar argumento y
(Transfere arg. de mult e chama função mult)
add
$a1,$a0,$zero
# transfere arg.x de mult(x,x)
jal
mult
# chama mult
(restaura arg. De SumSquare e executa operação)
lw
$a1, 0($sp)
# restaura arg. y
add
$v0,$v0,$a1
# mult()+y
(restaura end. retorno de SumSquare e a pilha)
lw
$ra, 4($sp)
# restaura end. retorno
addi
jr
$sp,$sp,8
$ra
# restaura pilha
# retorna para prog. principal
OAC – Linguagem de Máquina - Funções - 14
Juliana F Camapum Wanderley
7
Passos para fazer uma chamada de função
1) Salvar os valores necessários na pilha.
2) Atribuir argumento(s), se existir(em).
3) Chamar a função jal
4) Restaurar os valores da pilha.
OAC – Linguagem de Máquina - Funções - 15
Juliana F Camapum Wanderley
Regras para Funções
„
„
„
„
Chamada com uma instrução jal retorna com uma jr
$ra
Aceita até 4 argumentos em $a0, $a1, $a2 e $a3
Valor de retorno sempre está em $v0 (e se necessário
em $v1)
Deve seguir as convenções de registradores (mesmo em
funções que somente você vai chamar)! Então, quais
são elas?
OAC – Linguagem de Máquina - Funções - 16
Juliana F Camapum Wanderley
8
Registradores MIPS
A constante 0
$0
$zero
Valores de Retorno
$2-$3
$v0-$v1
Argumentos
$4-$7
$a0-$a3
Temporários
$8-$15
$t0-$t7
Salvos
$16-$23
$s0-$s7
Mais Temporários
$24-$25
$t8-$t9
Stack Pointer
$29
$sp
Return Address
$31
$ra
„
Em geral, você pode utilizar ou o nome ou o número. Os nomes
deixam o código mais fácil de se ler.
OAC – Linguagem de Máquina - Funções - 17
Juliana F Camapum Wanderley
Convenções de Registradores (1/5)
„
Caller (chamador): a função que faz a chamada
„
Callee (função): a função sendo chamada
„
„
Quando a função retorna da execução, o
chamador precisa saber quais registradores
podem ter mudado e quais não mudaram.
Convenções de Registradores: Um conjunto
geralmente aceito de regras de quais
registradores não mudam após uma chamada de
função (jal) e quais podem ter sido mudados.
OAC – Linguagem de Máquina - Funções - 18
Juliana F Camapum Wanderley
9
Convenções de Registradores (2/5)
„
„
„
„
$0: Nunca muda. Sempre 0.
$v0-$v1: Muda. Estes são esperados conter
novos valores.
$a0-$a3: Muda. Estes são registradores de
argumentos voláteis.
$t0-$t9: Muda. Por isso eles são chamados
temporários: qualquer função pode mudá-los a
qualquer momento.
OAC – Linguagem de Máquina - Funções - 19
Juliana F Camapum Wanderley
Convenções de Registradores (3/5)
„
„
„
$s0-$s7: Sem mudança. Muito importante, por isso eles são
chamados registradores salvos. Se a função chamada
(calle) muda estes registradores de algum modo, ela deve
restaurar os valores originais antes de retornar.
$sp: Sem mudança. O ponteiro da pilha deve apontar para o
mesmo lugar antes e depois de uma chamada de jal ou
então a função chamadora (caller) não será capaz de
restaurar os valores da pilha. A função chamada deve
restaurar os valores originais antes de retornar
$ra: Muda. A chamada a jal vai mudar este registrador por
si mesma.
OAC – Linguagem de Máquina - Funções - 20
Juliana F Camapum Wanderley
10
Convenções de Registradores (4/5)
„
O que estas convenções significam?
„
Se a função A chama B
„
„
„
a função A deve salvar qualquer registrador
temporário que esteja utilizando na pilha antes de fazer
uma chamada jal.
A função B deve salvar qualquer registrador S
(salvos - sp, $s0-$s7) que ela pretende utilizar antes de
modificar seus valores.
Lembre-se: Caller/callee precisam salvar somente
os registradores temporários que eles estejam
utilizando, não todos os registradores.
OAC – Linguagem de Máquina - Funções - 21
Juliana F Camapum Wanderley
Convenções de Registradores (5/5)
„
„
„
Note que, se callee vai utilizar algum registrador S, ela
deve:
„
Salvar aqueles registradores S na pilha.
„
Utilizar os registradores
„
Restaurar os registradores S da pilha.
„
jr $ra
Com os registradores temporários, a calle não
precisa salvar na pilha.
Portanto, a caller deve salvar aqueles registradores
temporários que quer preservar através da chamada.
OAC – Linguagem de Máquina - Funções - 22
Juliana F Camapum Wanderley
11
Exemplo: Compile isto (1/5)
main() {
int i,j,k,m; /* i-m:$s0-$s3 */
i = mult(j,k);...;
m = mult(i,i);...
}
int mult (int mcand, int mlier){
int product;
product = 0;
while (mlier > 0) {
product += mcand;
mlier -= 1; }
return product;
}
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Funções - 23
Exemplo: Compile isto (2/5)
start:
Transfere argumentos e chama função
add $a0,$s1,$0
add $a1,$s2,$0
jal mult
Programa Principal
main() {
int i,j,k,m; /* i-m:$s0-$s3 */
i = mult(j,k);...;
m = mult(i,i);...}
# arg0 = j
# arg1 = k
# call mult
Salva valor de retorno na variável estática $s0
add $s0,$v0,$0
# i = mult()
Transfere argumentos e chama função
add $a0,$s0,$0
add $a1,$s0,$0
jal mult
# arg0 = i
# arg1 = i
# call mult
Salva valor de retorno na variável estática $s3
add $s3,$v0,$0
Done:
...
OAC – Linguagem de Máquina - Funções - 24
# m = mult()
Juliana F Camapum Wanderley
12
Exemplo: Compile isto (3/5)
„
Notas:
„
„
função main (principal) termina com done, não
com jr $ra, assim não é necessário salvar $ra
na pilha.
todas as variáveis utilizadas na função main são
registradores salvos (estáticos), assim não é
necessário salvá-las na pilha.
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Funções - 25
Exemplo: Compile isto (4/5)
mult:
add
Função Multiplicação
$t0,$0,$0
# prod ($t0)=0
slt
beq
add
addi
j
$t1,$0,$a1
$t1,$0,Fim
$t0,$t0,$a0
$a1,$a1,-1
Loop
#
#
#
#
#
add
jr
$v0,$t0,$0
$ra
# $v0 = prod
# retorna
Loop:
mlr($a1) > 0?
não => vá para Fim
sim: prod += mc($a0)
mlr -= 1
goto Loop
Fim:
OAC – Linguagem de Máquina - Funções - 26
Mlr:multiplicador
Mc:multiplicando
Juliana F Camapum Wanderley
13
Exemplo: Compile isto (5/5)
„
Notas:
„
Função não aninhada: nenhuma chamada jal é feita de
mult
„
„
„
„
„
não utilizamos qualquer registrador salvo, logo não
precisamos salvar nada na pilha.
poderíamos ter utilizados registradores S, mas
teríamos que salvar na pilha.
registradores temporários são utilizados para cálculos
intermediários (não precisam ser salvos)
$a1 é modificado diretamente (ao invés de copiá-lo em um
registrador temporário) já que nós somos livres para
mudá-lo.
o resultado é posto em $v0 antes de retornar.
Juliana F Camapum Wanderley
OAC – Linguagem de Máquina - Funções - 27
Exemplo: Compile isto (1/2)
„
„
Fatorial
Int fact (int n)
{
if (n < 1) return (1);
else return (n * fact(n – 1));
}
Função recursiva
Colocar na pilha, todos os registradores que
necessitam ser preservados:
„
$a0-$a3, $t0-$t9, $ra, $s0, ajustar $sp.
„
No retorno: restaurar regs, restaurar $sp.
OAC – Linguagem de Máquina - Funções - 28
Juliana F Camapum Wanderley
14
Exemplo: Compile isto (2/2)
fact:
L1:
addi
sw
sw
slt
beq
$sp, $sp,-8
$ra, 4($sp)
$a0, 0($sp)
$t0, $a0, 1
$t0, $zero, L1
# reserva espaço na pilha (2 palavras)
# salva end. retorno na pilha
# salva argumento (n)
# n<1?
# não: (n>=1) vá para L1
addi
addi
jr
$v0, $zero, 1 # n=0: $v0=1
$sp, $sp, 8
# restaura a pilha
$ra
# retorna da função
addi
jal
$a0, $a0,-1
fact
# n=n-1 =>$a0=$a0-1
# chama fact(n-1)=> $v0=fact($a0)
lw
lw
addi
$a0, 0($sp)
$ra, 4($sp)
$sp, $sp, 8
# restaura argumento n ($a0)
# restaura end. retorno
# restaura pilha
mult
$v0, $a0, $v0 # $v0=n*fact(n-1)
jr
$ra
# retorna da função
OAC – Linguagem de Máquina - Funções - 29
Juliana F Camapum Wanderley
Coisas para Lembrar (1/2)
„
„
„
Funções são chamadas com jal, e retornam
com jr $ra.
A pilha é sua amiga: use-a para salvar
qualquer coisa que precise. Apenas assegure-se
de deixá-la como a achou.
Convenções de Registradores: Cada registrador
tem um propósito e limites no seu uso. Aprendaos e siga-os.
OAC – Linguagem de Máquina - Funções - 30
Juliana F Camapum Wanderley
15
Coisas para Lembrar (2/2)
„
Instruções que nós conhecemos até agora:
Aritmética: add, addi, sub
Memória:
lw, sw
Decisão:
beq, bne, slt
Desvios incondicionais (pulos): j, jal, jr
„
Registradores que nós conhecemos até agora:
„
$zero, $v0-$v1, $a0-$a3, $t0-$t7, $s0-$s7, $t8-$t9, $sp, $ra
OAC – Linguagem de Máquina - Funções - 31
Juliana F Camapum Wanderley
16
Organização e Arquitetura de Computadores
Aula 6 – Linguagem de Máquina
Operações Lógicas e de Deslocamento
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 1
Juliana F Camapum Wanderley
Panorama
„
Instruções Lógicas
„
Shifts - Deslocamentos
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 2
Juliana F Camapum Wanderley
1
Operações Bitwise (1/2)
„
Até agora:
aritmética (add, sub,addi ), acesso à memória (lw and
sw), desvios e pulos.
„
„
„
Todas estas instruções vêem o conteúdo de um
registrador como uma única quantidade (tal como
um inteiro com sinal ou sem sinal).
Nova Perspectiva: Ver o conteúdo do registrador
como 32 bits ao invés de como um número de 32
bits.
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 3
Juliana F Camapum Wanderley
Operações Bitwise (2/2)
„
„
Como os registradores são compostos de 32
bits, nós podemos querer acessar bits
individuais (ou grupos de bits) ao invés de
todo ele.
Temos então duas novas classes de operações:
„
Operadores Lógicos
„
Instruções Shift
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 4
Juliana F Camapum Wanderley
2
Operadores Lógicos (1/4)
„
Quantos se lembram de Matemática Discreta?
„
Dois operadores lógicos básicos:
„
„
AND: saída 1 somente se ambas as entradas são 1
„
OR: saída 1 se pelo menos uma entrada é 1
Em geral, podemos defini-los para aceitar >2 entradas:
„
„
assembly MIPS: ambos aceitam exatamente 2 entradas e
produzem 1 saída.
Novamente, sintaxe rígida, hardware mais simples
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 5
Juliana F Camapum Wanderley
Operadores Lógicos (2/4)
„
„
Tabela Verdade: tabela padrão listando todas as
possíveis combinações de entradas e saídas resultantes
para cada um.
Tabela Verdade para AND e OR
A
B
AND
OR
0
0
0
0
1
0
0
1
1
1
0
1
0
1
1
1
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 6
Juliana F Camapum Wanderley
3
Operadores Lógicos (3/4)
„
Sintaxe da Instrução Lógica:
1 2,3,4
„
onde
1) nome da operação
2) registrador que recebe o resultado
3) primeiro operando (registrador)
4) segundo operando (registrador) ou imediato
(constante numérica).
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 7
Juliana F Camapum Wanderley
Operadores Lógicos (4/4)
„
Nomes das Instruções:
„
„
„
and, or: Ambas esperam o terceiro argumento ser um
registrador.
andi, ori: Ambas esperam o terceiro argumento ser
um imediato.
Operadores Lógicos MIPS são todos bitwise:
„
„
o bit 0 da saída é produzido pelo respectivos bits 0's da
entrada
o bit 1 pelos respectivos bits 1, etc.
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 8
Juliana F Camapum Wanderley
4
Uso dos Operadores Lógicos (1/3)
„
anding um bit com 0 produz 0 na saída
„
anding um bit com 1 produz o bit original.
„
Isto pode ser utilizado para criar uma máscara.
„
Exemplo:
1011 0110 1010 0100 0011 1101 1001 1010
0000 0000 0000 0000 0000 1111 1111 1111
„
O resultado de anding estes dois é:
0000 0000 0000 0000 0000 1101 1001 1010
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 9
Juliana F Camapum Wanderley
Usos dos Operadores Lógicos (2/3)
„
A segunda bitstring: chamada de máscara.
„
„
Função: isolar os 12 bits mais à direita da bitstring
mascarando os outros (fazendo-os todos igual a 0s).
Operador and:
„
setar em 0s certas partes de uma bitstring
„
deixar os outros como estão, intactos.
„
Em particular, se a primeira string de bits do exemplo acima
estivesse em $t0, então a instrução a seguir iria mascará-la:
andi
$t0,$t0,0xFFF
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 10
Juliana F Camapum Wanderley
5
Uso dos Operadores Lógicos (3/3)
„
„
Similarmente:
„
oring um bit com 1 produz 1 na saída
„
oring um bit com 0 produz o bit original.
Função: forçar certos bits de uma string em 1s.
Por exemplo, se $t0 contém 0x12345678, então após esta
instrução:
„
ori
$t0, $t0, 0xFFFF
 $t0 contém 0x1234FFFF
„
(i.e. Os 16 bits de ordem mais alta são intocados, enquanto
que os 16 bits de ordem mais baixa são forçados a 1s).
„
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 11
Juliana F Camapum Wanderley
Instruções Shift (1/4)
„
Move (shift) todos os bits na palavra para a
esquerda ou direita um certo número de bits.
„
Exemplo: shift right por 8 bits
0001 0010 0011 0100 0101 0110 0111 1000
0000 0000 0001 0010 0011 0100 0101 0110
„
Exemplo: shift left por 8 bits
001 0010 0011 0100 0101 0110 0111 1000
0011 0100 0101 0110 0111 1000 0000 0000
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 12
Juliana F Camapum Wanderley
6
Instruções Shift (2/4)
„
Sintaxe das Instruções Shift:
1 2,3,4
„
onde
1) nome da operação
2) registrador que receberá o valor
3) primeiro operando (registrador)
4) quantidade de deslocamento - shift amount
(constante <= 32)
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 13
Juliana F Camapum Wanderley
Instruções Shift (3/4)
„
Instruções shift MIPS :
1. sll (shift left logical): desloca para esquerda e
completa os bits esvaziados com 0s.
2. srl (shift right logical): desloca para a direita e
preenche os bits esvaziados com 0s.
3. sra (shift right arithmetic): desloca para a direita
e preenche os bits esvaziados estendendo o sinal.
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 14
Juliana F Camapum Wanderley
7
Instruções Shift (4/4)
„
Exemplo: shift right arith por 8 bits
0001 0010 0011 0100 0101 0110 0111 1000
0000 0000 0001 0010 0011 0100 0101 0110
„
Exemplo: shift right arith por 8 bits
1001 0010 0011 0100 0101 0110 0111 1000
1111 1111 1001 0010 0011 0100 0101 0110
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 15
Juliana F Camapum Wanderley
Uso das Instruções Shift (1/5)
„
Isolar o byte 0 (8 bits mais à direita) de uma palavra
em $t0. Simplesmente use:
andi $t0,$t0,0xFF
„
Isolar o byte 1 (bit 15 ao bit 8) da palavra em $t0.
Nós podemos usar:
andi $t0,$t0,0xFF00
mas então nós ainda precisamos deslocar para a
direita por 8 bits ...
srl $t0,$t0,8
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 16
Juliana F Camapum Wanderley
8
Uso das Instruções Shift (2/5)
„
Ao invés nós poderíamos usar:
sll $t0,$t0,16
srl $t0,$t0,24
0001 0010 0011 0100 0101 0110 0111 1000
0101 0110 0111 1000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0101 0110
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 17
Juliana F Camapum Wanderley
Uso das Instruções Shift (3/5)
„
Em decimal:
„
„
„
Multiplicando por 10 é o mesmo que deslocar para a esquerda
por 1:
„
71410 x 1010 = 714010
„
5610 x 1010 = 56010
Multiplicando por 100 é o mesmo que deslocar para esquerda
por 2:
„
71410 x 10010 = 7140010
„
5610 x 10010 = 560010
Multiplicando por 10n é o mesmo que deslocar para a esquerda
por n
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 18
Juliana F Camapum Wanderley
9
Uso das Instruções Shift (4/5)
„
Em binário:
„
Multiplicar por 2 é o mesmo que deslocar para a esquerda
por 1:
„
„
„
„
112 x 102 = 1102
10102 x 102 = 101002
Multiplicar por 4 é o mesmo que deslocar para a esquerda
por 2:
„
112 x 1002 = 11002
„
10102 x 1002 = 1010002
Multiplicar por 2n é o mesmo que deslocar para a esquerda
por n
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 19
Juliana F Camapum Wanderley
Uso das Instruções Shift (5/5)
„
Como deslocar pode ser mais rápido que multiplicar,
um bom compilador usualmente percebe quando o
código C multiplica por uma potência de 2 e
compila como uma instrução shift:
a *= 8; (em C)
seria compilado como:
sll
„
$s0,$s0,3 (em MIPS)
Da mesma forma, desloque para a direita para
dividir por potências de 2
„
Lembre-se de usar sra (manter o sinal)
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 20
Juliana F Camapum Wanderley
10
Coisas para se Lembrar
„
„
„
„
Instruções Lógicas e Shift: operam em bits
individualmente
Aritméticas: operam em uma palavra toda.
Use Instruções Lógicas e Shift para isolar campos, ou
mascarando ou deslocando para um lado ou para
outro.
Novas Instruções:
and, andi, or, ori
sll, srl, sra
OAC – Ling. de Máquina – Operações Lógicas e de Deslocamento - 21
Juliana F Camapum Wanderley
11
Organização e Arquitetura de Computadores
Aula 7 – Linguagem de Máquina
Strings, Endereçamento Imediato e Relativo
e Pseudo-Instruções
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Ling. de Máquina – Strings, Endereçamento - 1
Juliana F Camapum Wanderley
Panorama
„
Além dos Números →Textos
„
Endereçamento imediato (constantes)
„
„
„
Endereçamento relativo (desvios
condicionais)
Endereçamento absoluto (desvios
incondicionais)
Montador → Pseudo-instruções
OAC – Ling. de Máquina – Strings, Endereçamento - 2
Juliana F Camapum Wanderley
1
Além dos Números
„
„
„
Computadores: inicialmente números.
Depois: textos.
Muito usado: código ASCII.
„
„
Seria possível usar instruções vistas até agora (carga de palavra de 32 bits).
Entretanto: operação muito comum → uma instrução específica:
OAC – Ling. de Máquina – Strings, Endereçamento - 3
Juliana F Camapum Wanderley
Transferência de Bytes
„
„
„
„
lb $t0,0($sp)
# ler um byte da memória.
sb $t0,0($sp)
# escrever um byte.
Cada byte ocupa uma posição da memória.
Representação de caracteres:
„
„
„
„
1a posição é reservada para o tamanho do mesmo.
Uma variável associada ao string guarda o tamanho.
Na última posição do string aparece um caracter nulo
(ASCII '0'). Usado na linguagem C.
Exemplo: rotina para copiar um string para outro.
Void strcpy(char x[ ], char y[ ]) {
int i;
i =0;
while (x[i]=y[i]!= 0) i = i+1;
}
OAC – Ling. de Máquina – Strings, Endereçamento - 4
Juliana F Camapum Wanderley
2
Compilação (1/2)
„
x e y: $a0 e $a1, $s0 para i
Void strcpy(char x[ ], char y[ ]) {
int i;
i =0;
while (x[i]=y[i]!= 0) i = i+1;
}
strcpy: addi
sw
add
$sp,$sp,-4
$s0,0($sp)
$s0,$zero,$zero
# reserva espaço na pilha
# salva $s0 (índice i)
#i=0
L1:
add
lb
add
sb
$t1,$a1,$s0
$t2,0($t1)
$t3,$a0,$s0
$t2,0($t3)
# $t1=end. de y[i]=y+i
# $t2 ← y[i]
# $t3=end de x[i]=x+i
# x[i] ← y[i]
addi
$s0,$s0,1
#i←i+1
bne
$t2,$zero,L1
# Volta se y[i]≠0
lw
addi
jr
$s0,0($sp)
$sp,$sp,4
$ra
# restaura $s0
# restaura $sp
OAC – Ling. de Máquina – Strings, Endereçamento - 5
Juliana F Camapum Wanderley
Compilação (2/2)
„
Nota:
„
Procedimento anterior: folha.
„
Seria melhor, ao invés de usar $s0, usar $t0.
„
Não é obrigatório preservar valores de variáveis temporárias.
OAC – Ling. de Máquina – Strings, Endereçamento - 6
Juliana F Camapum Wanderley
3
Operandos Imediatos ou Constantes
„
„
„
„
Incremento do índice de um array.
Incremento do contador de um laço.
Ajuste do $sp.
Exemplo: SPEC...
„
„
„
gcc: 52% das ops: imediatos.
Spice: 69%.
Oferecer versões de instruções em que um dos
operandos é uma constante.
„
„
„
Constante: mantida dentro da própria instrução
(regularidade).
Tipo I (I-type): “I” de Imediato.
Tamanho da constante: 16 bits.
OAC – Ling. de Máquina – Strings, Endereçamento - 7
Juliana F Camapum Wanderley
Instruções Imediatas
„
Princípio de projeto 4: Torne o caso comum mais
rápido.
„
„
Com estas instruções, não é preciso carregar
primeiramente as constantes em registradores antes de
operar.
Nomes das Instruções:
„
„
addi $sp,$sp,4
# $sp ← $sp + 40
op
rs
rt
Imediato
8
29
29
4
6 bits
5 bits
5 bits
16 bits
001000
11101
11101
0000 0000 0000 0100
slti $t0,$s2,10
# seta $t0 se $s2 < 10
OAC – Ling. de Máquina – Strings, Endereçamento - 8
Juliana F Camapum Wanderley
4
Instrução “lui” (load upper immediate)
„
„
Problema: às vezes são necessárias constantes de 32
bits.
Solução: Carregar nos registradores.
„
lui $t0, 255 # 16 bits sup. de $t0 ← 255
Exemplo: Carregar este padrão em $s0:
0000 0000 0011 1101 0000 1001 0000 0000
„
lui
$s0,0x003D
addi $s0,$s0,0x0900
OAC – Ling. de Máquina – Strings, Endereçamento - 9
Juliana F Camapum Wanderley
Endereçamento nos Desvios Condicionais e
Incondicionais
„
Desvio incondicional:
„
j Fim
# desvia para Fim (end.800000=0x000C3500)
Op
(Campo endereço x 4 ) ocupa 28bits: serão
concatenados 4 bits mais significativos do PC para
formar o endereço de 32 bits
„
endereço (palavras)
200000=0x0030D40
26 bits
2
6 bits
Formato do desvio condicional
„
bne $s0,$s1,Exit
# desvia para Exit
Op
End. Instrução bne = 72
(
5
6 bits
(end.100)
rs
16
5 bits
se $s0 ≠ $s1
rt
17
5 bits
)
offset do endereço(palavras)
6
16 bits
end. destino (label ) = end.origem ( PC ) + 4 + offset ( palavras ) × 4
„
„
Efeito do end. Relativo: os 16 bits são um offset que somado à próxima
posição do PC compõe o endereço de destino.
J e JAL: não usa end. Relativo.
OAC – Ling. de Máquina – Strings, Endereçamento - 10
Juliana F Camapum Wanderley
5
Exemplo: loop while
bne
Exit
80000
80004
80008
80012
80016
80020
80024
80028
80032
0
0
0
35
5
0
2
19
9
9
9
8
19
35
9
19
9
21
8
21
20
Loop: add
add
add
lw
bne
add
j
Exit:
9
9
9
19
20000
-----
8
OAC – Ling. de Máquina – Strings, Endereçamento - 11
0
0
0
0
2
0
$t1,$s3,$s3
$t1,$t1,$t1
$t1,$t1,$s5
$t0,0($t1)
$t0,$s5,Exit
$s3,$s3,$s4
Loop
32
32
32
palavras
32
palavras
0
Juliana F Camapum Wanderley
Desvio condicional grande
„
Neste caso, o montador insere um jump
„
Campo offset (end. relativo) é de 16 bits –
beq, bne
„
„
Campo end. absoluto é de 26 bits – j, jal
„
„
Como o campo de offset é relativo a uma
palavra, representa end. em bytes de 18bits,
ou seja, ±217= ±128KB
Exemplo:
Instrução original
beq $s0,$s1,L1
Instrução modificada
bne $s0,$s1,L2
J
L1
L2:
Como o campo de endereço é relativo a uma
palavra, representa end. em bytes de 28bits,
ou seja, 228= 256MB
Acima deste valor (32 bits) usar registrador –
jr $registrador
OAC – Ling. de Máquina – Strings, Endereçamento - 12
Juliana F Camapum Wanderley
6
Transformação C → Executável (1/8)
4 passos: C → Linguagem de máquina.
„
OAC – Ling. de Máquina – Strings, Endereçamento - 13
Juliana F Camapum Wanderley
Transformação C → Executável (2/8)
„
Compilador
„
Transforma C → Assembly
„
Linguagem de alto nível: maior produtividade.
„
„
Antigamente: escrito em Assembly. Presentemente: em ling. de
alto nível.
Montador
„
Assembly → Ling. de máquina.
„
MIPS: O assembly “incrementa” artificialmente o set de instruções.
„
Pseudo-instruções:
„
Não existem na máquina.
„
O montador as cria.
Melhora os recursos do Assembly.
OAC – Ling. de„Máquina – Strings, Endereçamento - 14
Juliana F Camapum Wanderley
7
Transformação C → Executável (3/8)
„
Pseudo-instruções
„
move $t0,$t1
„
„
o montador transforma em: add $t0,$zero,$t1
blt (branch if less than).
„
„
„
„
„
# $t0 ← $t1
o montador substitui esta pseudo-instrução automaticamente por uma
combinação de slt/bne.
bgt, bge, ble
Montador do MIPS: converte um branch fora da faixa em um
branch mais um jump.
Permite carregar constantes de 32 bits em um registrador, usando
combinação de instruções.
O MIPS utiliza o registrador $at para uso exclusivo do montador.
OAC – Ling. de Máquina – Strings, Endereçamento - 15
Juliana F Camapum Wanderley
Transformação C → Executável (4/8)
„
Montador
„
aceitam números em diferentes bases: decimal, binário,
hexadecimal.
„
„
0000 0000 1010 1111 1000 0000 0010 0000 = 00af 8020hexa
transforma o programa em linguagem de máquina em
um arquivo objeto → combinação de:
„
instruções em linguagem de máquina;
„
dados;
„
informações necessárias para carregar o programa
adequadamente na memória.
OAC – Ling. de Máquina – Strings, Endereçamento - 16
Juliana F Camapum Wanderley
8
Transformação C → Executável (5/8)
„
Para produzir a versão binária:
„
„
É preciso saber os endereços dos labels (tabela de símbolos).
Arquivo objeto: deve conter...
„
„
„
„
„
„
Cabeçalho do arquivo objeto, com tamanho e posição.
O segmento de texto que contém o código em linguagem de
máquina.
O segmento de dados, que contém os dados necessários.
Informação sobre relocação: como os endereços absolutos são
redefinidos.
Tabela de símbolos: labels não-definidos, como referências
externas.
Informações para análise de erros (debbuger).
OAC – Ling. de Máquina – Strings, Endereçamento - 17
Juliana F Camapum Wanderley
Transformação C → Executável (6/8)
„
Ligador
„
Mudança em um programa, que é parte de um conjunto: tem
que mudar todo o programa?
„
Não. Só uma parte é recompilada.
„
Cada programa já pode estar compilado (em ling. de máquina).
„
„
Um programa chamado ligador (linker) “monta” os programas
como um único programa.
3 passos:
„
„
„
Colocar os módulos de código e dados
simbolicamente na memória
Determinar os endereços dos labels de dados e de
instruções.
Resolver as referências externas e internas.
Usa, para tal, as informações do programa objeto.
Juliana F Camapum Wanderley
„ de Máquina – Strings, Endereçamento - 18
OAC – Ling.
9
Transformação C → Executável (7/8)
„
MIPS: convenções para o linker alocar
endereços para dados e programas:
„
„
O ligador “monta” o arquivo, colocando os
endereços certos. Gera um arquivo
executável.
Resolver o exemplo no livro: ligação de
arquivos hipotéticos.
$gp – global pointer – aponta para o endereço
1000 8000hexa – inst. lw e sw $t0,offset($gp)
$gp+offset = [1000 0000 – 1000 7FFF]
se offset = [8000 – FFFF]
$gp+offset = [1000 8000 – 1000 FFFF]
se offset = [0000 – 7FFF]
OAC – Ling. de Máquina – Strings, Endereçamento - 19
Juliana F Camapum Wanderley
Exemplo: Ligação de Arquivos-Objeto
Cabeçalho(arq. Obj)
Cabeçalho (arq. Obj)
Nome
Proced. A
Tam(cód)
100hexa
Tam(dados) 20hexa
Segmento (código)
Endereço
Instrução
Nome
Proced. B
Tam(cód) 200hexa
Tam(dados) 30hexa
Segmento (código)
Endereço Instrução
0
4
0
4
0
0
4
X
B
lw $a0,0($gp)
jal 0
…
…
Segmento (dados)
(X)
…
…
Informação relocação
lw
X
jal
B
Tabela de Símbolos
…
…
0
0
4
Y
A
sw $a1,0($gp)
jal 0
…
…
Segmento (dados)
(Y)
…
…
Informação relocação
sw
Y
Jal
A
Tabela de Símbolos
…
…
OAC – Ling. de Máquina – Strings, Endereçamento - 20
Cabeçalho (executável)
Tam(cód)
300hexa
Tam(dados)
50hexa
Segmento (código)
Endereço
Instrução
0040 0000hexa
lw $a0, 8000hexa($gp)
0040 0004hexa jal 0040 0100hexa
…
…
0040 0100hexa sw $a1, 8020hexa($gp)
0040 0104hexa jal 0040 0000hexa
…
…
Segmento (dados)
1000 0000hexa
(X)
…
…
1000 0020hexa
(Y)
…
…
Juliana F Camapum Wanderley
10
Transformação C → Executável (8/8)
„
Carregador (Loader)
„
Realiza o carregamento do programa na memória.
No UNIX:
1.
Leitura do cabeçalho.
2.
Criação de espaço de cód. e dados.
3.
Copiar instr. e dados para a memória.
4.
Copiar os parâmetros p/ a pilha (quando houver).
5.
Iniciar o SP.
6.
Desviar para a rotina de inicialização
OAC – Ling. de Máquina – Strings, Endereçamento - 21
Juliana F Camapum Wanderley
Exemplo Para Juntar as Peças
„
O procedimento swap (folha).
„
Troca dois elementos consecutivos no array.
„
Na tradução:
1.
Alocar registradores para as variáveis.
2.
Produzir código para o procedimento.
3.
Preservar os registradores nas chamadas.
OAC – Ling. de Máquina – Strings, Endereçamento - 22
Juliana F Camapum Wanderley
11
Swap(int v[ ], int k) {
Tradução do procedimento swap
int temp;
temp=v[k];
v : $a0, k: $a1, temp: $t0
v[k]=v[k+1];
Swap:
v[k+1]=temp; }
add $t1, $a1, $a1
add $t1, $t1, $t1
add $t1, $a0, $t1
# $t1←2*k
# $t1←4*k
# base de v[k]
lw $t0, 0($t1)
lw $t2, 4($t1)
# $t0 ← v[k]
# $t2 ← v[k+1]
sw $t2, 0($t1)
sw $t0, 4($t1)
jr
$ra
# v[k] ← $t2
# v[k+1] ← $t0
# retorna
OAC – Ling. de Máquina – Strings, Endereçamento - 23
Juliana F Camapum Wanderley
Procedimento sort (não-folha)
sort (int v[ ], int n) {
int i,j;
for (i=0; i < n; i = i+1)
v : $a0, n: $a1, i: $s0, j: $s1
for (j=i-1; j>=0 &&v[j]>v[j+1];j=j-1)
swap(v, j); }
# for externo → for (i=0; i < n; i = i+1)
move $s0, $zero
for1tst: slt
beq
# i=0
$t0,$s0,$a1
# i<n?
$t0,$0,exit1
#não: vá para exit1 (sai)
# sim: executa segundo loop for (corpo do primeiro loop for)
addi $s0,$s0,1
# i → i+1
j
# vá p/ for1tst
for1tst
exit1:
OAC – Ling. de Máquina – Strings, Endereçamento - 24
Juliana F Camapum Wanderley
12
·
# Segundo loop for→ for (j=i-1; j>=0 && v[j]>v[j+1] ;j= j-1) swap(v, j);
addi $s1,$s0,-1
for2tst: slti
# j←i-1
$t0,$s1,0
# j<0?
bne
$t0,$zero,exit2
#sim (j<0 ): vá para exit2 (sai)
add
$t1,$s1,$s1
#não (j≥0): $t1←2*j
add
$t1,$t1,$t1
#$t1←4*j
add
$t2,$a0,$t1
# end v[j]
lw
$t3,0($t2)
# $t3 ← v[j]
lw
$t4,4($t2)
# $t4 ←v[j+1]
slt
$t0,$t4,$t3
# v[j]>v[j+1] ?deixa loop
beq
$t0,$zero,exit2
#não: vá para exit2(sai)
# sim: executa swap (corpo do segundo loop for)
addi $s1,$s1,-1
j
# j ← j-1
for2tst
v : $a0, n: $a1, i: $s0, j: $s1
exit2:
OAC – Ling. de Máquina – Strings, Endereçamento - 25
Juliana F Camapum Wanderley
Passagem de parâmetros e chamada
„
„
„
„
A rotina sort e swap utilizam os mesmos parâmetros de
passagem $a0 e $a1 → é preciso salvá-los antes de
passá-los para swap.
Uma opção → salvar na pilha, e recuperar depois.
Outra opção → salvar em outros regs. (usaremos esta).
Salvando parâmetros de sort (v[ ],n) v : $a0, n: $a1
„
„
„
move
move
$s2, $a0
$s3, $a1
# $s2 ← $a0
# $s3 ← $a1
Passando parâmetros para rotina swap(v,j) v : $s2, j: $s1
„
„
„
move
move
jal
$a0, $s2 # $ a0← $ s2
$a1, $s1 # $ a1← $ s1
swap
OAC – Ling. de Máquina – Strings, Endereçamento - 26
Juliana F Camapum Wanderley
13
Preservação dos Valores dos Registradores
de sort
„
„
„
„
sort é chamada por outra subrotina.
Não deve destruir os registradores permanentes
utilizados, $s0 a $s3.
Dever preservar o $ra.
Inicialização da rotina sort: salvar reg. na pilha
addi
sw
sw
sw
sw
sw
„
$sp,$sp,-20
$ra,16($sp)
$s3,12($sp)
$s2,8($sp)
$s1,4($sp)
$s0,0($sp)
Antes de sair de sort: reverter estas seqüências.
OAC – Ling. de Máquina – Strings, Endereçamento - 27
Juliana F Camapum Wanderley
Procedimento sort completo
OAC – Ling. de Máquina – Strings, Endereçamento - 28
Juliana F Camapum Wanderley
14
Programa sort
„
C: 9 linhas.
„
Assembly: 35 linhas.
„
Outro método: “inlining”.
„
Vantagem: economiza 4 chamadas.
„
Desvantagem: caso seja utilizada por outras rotinas.
OAC – Ling. de Máquina – Strings, Endereçamento - 29
Juliana F Camapum Wanderley
Programa Clear usando Array e ponteiros.
„
Comparar duas implementações de uma rotina
(para casa).
OAC – Ling. de Máquina – Strings, Endereçamento - 30
Juliana F Camapum Wanderley
15
Organização e Arquitetura de Computadores
Aula 8 – Representação de Números
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Ling. de Máquina – Representação de Números - 1
Juliana F Camapum Wanderley
Sumário
n
Representação do computador das "Coisas"
n
Números sem sinal Unsigned
n
Computadores trabalhando
n
Números com sinal Signed: busca por uma
boa representação
n
Atalhos
n
Conclusão
OAC – Ling. de Máquina – Representação de Números - 2
Juliana F Camapum Wanderley
1
O que os computadores fazem?
n
n
Computadores manipulam representações de
coisas!
O que se pode representar com N bits?
n
n
2N coisas!
Quais coisas?
n
n
Números! Caracteres! Pixels! Dólares! Posição!
Instruções! ...
Depende de quais operações se faz sobre eles
OAC – Ling. de Máquina – Representação de Números - 3
Juliana F Camapum Wanderley
Números Decimais: Base 10
n
Dígitos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Exemplo:
3271 = (3x103) + (2x102) + (7x101) + (1x100)
n
OAC – Ling. de Máquina – Representação de Números - 4
Juliana F Camapum Wanderley
2
Números: notação posicional
n
Número Base B => B símbolos por dígito:
n
n
Representação do Número:
n
n
n
Base 10 (Decimal): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Base 2 (Binário):
0, 1
d31d30 ... d 2d1d0 é um número de 32 dígitos
valor = d31x B31 + d30 x B30 + ... + d2 x B2 + d 1 x B1 + d0 x B0
Binário: 0,1
n
n
n
1011010 = 1x2 6 + 0x2 5 + 1x24 + 1x23 + 0x22 + 1x2 + 0x1 =
64 + 16 + 8 + 2 = 90
Note que um número binário de 7 dígitos se transforma em um
número decimal de 2 dígitos.
Existe uma base que converte facilmente para números
binários?
OAC – Ling. de Máquina – Representação de Números - 5
Juliana F Camapum Wanderley
Números Hexadecimais: Base 16
n
Hexadecimal:
0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F
n
n
Dígitos Normais + 6 mais: tomados do alfabeto
Conversão: Binário <-> Hex
n
1 dígito hex representa 16 valores decimais
n
4 dígitos binários representam 16 valores decimal
=> 1 dígito hex substitui 4 dígitos binários
n
Exemplos:
n
1010 1100 0101 (binary) = ? (hex)
n
10111 (binary) = 0001 0111 (binary) = ?
n
3F9(hex) = ? (binary)
OAC – Ling. de Máquina – Representação de Números - 6
Juliana F Camapum Wanderley
3
Decimal vs. Hexadecimal vs.Binário
Exemplos:
♦ 1010 1100 0101 (binary)
= AC5 (hex)
♦
10111 (binary)
= 0001 0111 (binary)
= 17 (hex)
♦
3F9(hex)
= 11 1111 1001 (binary)
♦
00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Juliana F Camapum Wanderley
OAC – Ling. de Máquina – Representação de Números - 7
O que fazer com as representações de
números?
n
Exatamente o que fazemos com números!
•
•
•
•
•
Somá-los
Subtraí-los
Multiplicá-los
Dividi-los
Compará-los
+
1 1
1 0
1
0
0
1
1
1
---------------n
Exemplo:
•
•
10 + 7 = 17
1
0
0
0
1
Tão simples somar em binário que podemos fazer circuitos
para fazê-lo
Subtração também exatamente como se faz em decimal
OAC – Ling. de Máquina – Representação de Números - 8
Juliana F Camapum Wanderley
4
Comparação
n
Como dizer se X > Y?
n
Veja se X- Y > 0
OAC – Ling. de Máquina – Representação de Números - 9
Juliana F Camapum Wanderley
Qual base nós utilizamos?
n
n
Decimal: bom para humanos, especialmente para fazer
aritmética
Hex: ao olhar para uma string longa de números binários,
é muito mais fácil converter para hex e olhar 4
bits/símbolo
n
n
Terrível para aritmética; just say no
Binário: o que computadores usam;
aprender como os computadores fazem +,-,*,/
n
n
n
Para um computador, números sempre binários
Não importa como o número é escrito:
3210 == 0x20 == 1000002
Use subscritos “dez”, “hex”, “dois” no texto, slides, etc quando
puder confundir
OAC – Ling. de Máquina – Representação de Números - 10
Juliana F Camapum Wanderley
5
Limites dos Números do Computador
n
Bits podem representar qualquer coisa!
n
Caracteres?
n
n
n
n
26 letras => 5 bits
maisc./minusc. + pontuação
=> 7 bits (em 8) (“ascii”)
Código padrão para atender todas as linguagens do mundo
=> 16 bits (unicode)
Valores lógicos?
n
0 -> Falso, 1 => Verdadeiro
n
cores ?
n
localizações / endereços? comandos?
n
Mas N bits => somente 2N coisas
OAC – Ling. de Máquina – Representação de Números - 11
Juliana F Camapum Wanderley
Como representar números negativos?
n
n
Até agora, números sem sinal unsigned
Solução óbvia: definir o bit mais à esquerda para ser o
sinal!
n
0 => +, 1 => -
n
Resto dos bits podem ser valores numéricos do número
n
Representação chamada sign and magnitude
n
MIPS usa inteiros de 32-bit +1dez seria:
0000 0000 0000 0000 0000 0000 0000 0001
n
E - 1dez em sign and magnitude seria:
1000 0000 0000 0000 0000 0000 0000 0001
OAC – Ling. de Máquina – Representação de Números - 12
Juliana F Camapum Wanderley
6
Problemas da sign and magnitude?
n
Circuito Aritmético mais complicado
n
n
Ainda, dois zeros
n
0x00000000 = +0dez
n
0x80000000 = -0dez
n
n
Passos especiais dependendo se os sinais são os
mesmos ou não
O que significaria para a programação?
Sign and magnitude abandonada
Juliana F Camapum Wanderley
OAC – Ling. de Máquina – Representação de Números - 13
Outra tentativa: complementar os bits
n
n
n
Exemplo:
710 = 001112 -710 = 110002
Chamada complemento de um
Nota: números positivos tem 0s na frente,
números negativos tem 1s.
00000
00001 ...
01111
10000 ... 11110 11111
° O que é -00000 ?
° Quantos números positivos em N bits?
° Quantos negativos?
OAC – Ling. de Máquina – Representação de Números - 14
Juliana F Camapum Wanderley
7
Problemas do complemento de um
n
Aritmética não muito difícil
n
Ainda dois zeros
n
0x00000000 = +0dez
n
0xFFFFFFFF = -0dez
n
n
O que significaria para a programação?
Complemento de um abandonado porque outra
solução foi melhor
OAC – Ling. de Máquina – Representação de Números - 15
Juliana F Camapum Wanderley
Busca por Representação do Número Negativo
♦
Qual é o resultado para números sem sinal se tentamos
subtrair um número grande de um pequeno?
•
Tentaria pegar da string de 0s da frente de modo que o
resultado seria uma string de 1s na frente
−
•
•
Na falta de uma alternativa melhor, escolher a representação
que faz o hardware simples.
Como com o complemento de um, 0s a frente => positivo,
1s a frente => negativo
−
−
−
♦
3 - 4 => ...0011 - ...0100 = ...1111
000000...xxx é >=0
111111...xxx é < 0
exceto ...1111 é -1 não zero
Complemento de dois
OAC – Ling. de Máquina – Representação de Números - 16
Juliana F Camapum Wanderley
8
"Linha" dos Números Complemento de 2´s
00000 00001
11111
11110
00010
-1 0 1
11101
2
-2
-3
11100
-4
.
.
.
.
.
.
-15 -16 15
n
2 N-1 não
negativos
n
2 N-1 negativos
n
um zero
n
n
Quantos
positivos?
Overflow?
10001 10000 01111
OAC – Ling. de Máquina – Representação de Números - 17
Juliana F Camapum Wanderley
Complemento de Dois
n
0000 ... 0000 0000 0000 0000dois =
0dez
0000 ... 0000 0000 0000 0001dois =
1dez
0000 ... 0000 0000 0000 0010dois =
2dez
...
0111 ... 1111 1111 1111 1101dois = 2.147.483.645dez
0111 ... 1111 1111 1111 1110dois = 2.147.483.646dez
0111 ... 1111 1111 1111 1111dois = 2.147.483.647dez
1000 ... 0000 0000 0000 0000dois = -2.147.483.648dez
1000 ... 0000 0000 0000 0001dois = -2.147.483.647dez
1000 ... 0000 0000 0000 0010dois = -2.147.483.646dez
...
1111 ... 1111 1111 1111 1101dois =
-3dez
1111 ... 1111 1111 1111 1110dois =
-2dez
1111 ... 1111 1111 1111 1111dois =
-1dez
Um zero, 1° bit chamado bit de sinal , um negativo “extra”, não há
2.147.483.648dez
OAC – Ling. de Máquina – Representação de Números - 18
Juliana F Camapum Wanderley
9
Fórmula do Complemento de Dois
n
Pode representar números positivos e negativos em
termos do valor do bit vez uma potência de 2:
n
n
d31 x -231 + d30 x 230 + ... + d2 x 22 + d 1 x 21 + d0 x 20
Exemplo
1111 1111 1111 1111 1111 1111 1111 1100dois
= 1x-231 +1x230 +1x229+... +1x22+0x21+0x20
= -231 + 230 + 229 + ... + 22 + 0 + 0
= -2.147.483.648dez + 2.147.483.644dez
= -4dez
n
Nota: deve-se especificar a largura: nós usamos 32 bits
OAC – Ling. de Máquina – Representação de Números - 19
Juliana F Camapum Wanderley
Atalho do complemento de dois: Negação
n
Inverter cada 0 para 1 e cada 1 para 0, então somar 1 ao
resultado
n
n
Soma de um número seu complemento de um deve ser
111...111dois
n
111...111dois = -1dez
n
Seja x´ a representação invertida de x
n
Então x + x´ = -1 => x + x´ + 1 = 0 => x´ + 1 = -x
Exemplo: -4 para +4 para -4
x : 1111 1111 1111 1111 1111 1111 1111 1100dois
x´: 0000 0000 0000 0000 0000 0000 0000 0011dois
+1: 0000 0000 0000 0000 0000 0000 0000 0100dois
()´: 1111 1111 1111 1111 1111 1111 1111 1011dois
+1: 1111 1111 1111 1111 1111 1111 1111 1100dois
OAC – Ling. de Máquina – Representação de Números - 20
Juliana F Camapum Wanderley
10
Atalho do compl. de dois: extensão do sinal
♦ Converter número em complemento de 2 usando n
bits para mais de n bits
♦ Simplesmente repetir o bit mais significante (bit de
sinal) do menor para preencher os novos bits
• Complemento de 2 positivo tem infinitos 0s
• Complemento de 2 negativo tem infinitos 1s.
• Representação de bit esconde os bits a frente;
extensão de sinal restaura alguns deles
• 16-bit -4dez para 32-bit:
1111 1111 1111 1100dois
1111 1111 1111 1111 1111 1111 1111 1100dois
OAC – Ling. de Máquina – Representação de Números - 21
Juliana F Camapum Wanderley
Números com Sinal vs. Números sem Sinal
n
Declaração C int
n
n
n
Declara um número com sinal
Usa complemento de dois
Declaração C unsigned int
n
n
Declara um número sem sinal
Trata números 32 bits como inteiros sem sinal, de modo
que o bit mais significante é parte do número, não um bit
de sinal
n X = 1111 1111 1111 1111 1111 1111 1111 1100dois
n Y = 0011 1011 1001 1010 1000 1010 0000 0000dois
n É X > Y?
n Sem sinal: SIM
n Com sinal: NãO
OAC – Ling. de Máquina – Representação de Números - 22
Juliana F Camapum Wanderley
11
Números são armazenados em endereços
n
Memória é um lugar para
armazenar bits
n
Uma palavra é um número
fixo de bits (e.g., 32) em um
endereço.
n
Endereços são naturalmente
representados como número
sem sinal
00000
101101100110
01110
11111 = 2k - 1
OAC – Ling. de Máquina – Representação de Números - 23
Juliana F Camapum Wanderley
E se o número for muito grande?
n
n
Os padrões de bits acima são apenas representações de
números
Os números realmente tem um número infinito de dígitos
•
•
n
Com quase todos sendo os mesmos exceto por alguns poucos
mais à direita
Simplesmente não mostre normalmente os dígitos à frente
Se o resultado de somar (-, *, /) não pode ser
representado por estes bits de HW mais à direita,
acontece o que é conhecido como overflow
00000
00001
00010
11110
11111
unsigned
OAC – Ling. de Máquina – Representação de Números - 24
Juliana F Camapum Wanderley
12
Conclusão
n
Nós representamos "coisas" no computador como
padrões particulares de bits: N bits =>2N
n
n
n
n
n
números, caracteres, ...
Decimal para cálculos humanos, binário para entender
computadores, hex para entender binário
Complemento de 2 é universal em computação: não
pode ser evitado, então aprenda
Operações no Computador sobre as representações de
números correspondem as operações reais sobre as
coisas reais.
Overflow: números são infinitos mas os computadores
são finitos, assim erros podem ocorrer
OAC – Ling. de Máquina – Representação de Números - 25
Juliana F Camapum Wanderley
13
Organização e Arquitetura de Computadores
Aula 9 – Linguagem de Máquina
Aritmética Computacional
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Ling. de Máquina – Aritmética Computacional - 1
Juliana F Camapum Wanderley
Lembrando
„
Instruções Lógicas e Shift operam em bits individuais,
diferente de add/sub que operam na palavra toda.
sll, srl, sra, and, andi, or, ori
„
„
„
Use instruções lógicas e shift para isolar campos,
mascarando ou deslocando para trás e para frente.
Use shift left logical, sll,para multiplicação por
potências de 2.
shift right arithmetic, sra,para divisão por
potências de 2.
OAC – Ling. de Máquina – Aritmética Computacional - 2
Juliana F Camapum Wanderley
1
Panorama
„
Loading/Storing Bytes
„
Instruções MIPS Signed vs. Unsigned
„
Pseudo-instructions
„
Multiplicação/Divisão
„
Ponteiros em Linguagem Assembly
OAC – Ling. de Máquina – Aritmética Computacional - 3
Juliana F Camapum Wanderley
Loading, Storing bytes
„
Além de transferência de dados em palavras
(lw, sw), MIPS tem também transferência de
dados em bytes:
„
load byte: lb
„
store byte: sb
„
mesmo formato que lw, sw
OAC – Ling. de Máquina – Aritmética Computacional - 4
Juliana F Camapum Wanderley
2
Loading, Storing bytes
„
Que fazer com os outros 24 bits no registrador de 32
bits?
„
„
lb: estende o sinal para preencher os 24 bits
superiores.
Suponha que o byte 100 tem o valor 0x0F, o byte 200
tenha o valor 0xFF
lb $s0, 100($zero) # $s0 = ?
lb $s1, 200($zero) # $s1 = ??
„
Múltipla escolha para $s0? $s1?
a) 15; b) 255; c) -1; d) -255; e) -15
OAC – Ling. de Máquina – Aritmética Computacional - 5
Juliana F Camapum Wanderley
Loading bytes
„
„
Normalmente, com caracteres, nós não
queremos estender o sinal.
Instrução MIPS que não estende o sinal quando
carregando bytes:
load byte unsigned: lbu
OAC – Ling. de Máquina – Aritmética Computacional - 6
Juliana F Camapum Wanderley
3
Panorama
„
Loading/Storing Bytes
„
Instruções MIPS Signed vs. Unsigned
„
Pseudo-instructions
„
Multiplicação/Divisão
„
Ponteiros em Linguagem Assembly
OAC – Ling. de Máquina – Aritmética Computacional - 7
Juliana F Camapum Wanderley
Overflow em Aritmética (1/2)
„
„
Lembrete: Overflow ocorre quando há um erro
na aritmética devido à precisão limitada dos
computadores.
Exemplo (números sem sinal 4-bit ):
+15
1111
+3
0011
+18
10010
„
Mas não há espaço para o bit 5 da solução, então a
solução deveria ser 0010, que é +2, e é errado.
OAC – Ling. de Máquina – Aritmética Computacional - 8
Juliana F Camapum Wanderley
4
Overflow em Aritmética (2/2)
„
„
Algumas linguagens detectam overflow (Fortran), outras
não (C).
Solução MIPS: dois tipos de instruções aritméticas para
reconhecer 2 escolhas:
„ add (add), add imediato (addi) e subtrai (sub)
causam detecção de overflow gerando interrupção
„
„
add unsigned (addu), add imediato unsigned (addiu)
e subtrai unsigned (subu) não causam detecção de
overflow
Compilador seleciona aritmética apropriada.
„ Compilador MIPS C produz addu, addiu, subu
OAC – Ling. de Máquina – Aritmética Computacional - 9
Juliana F Camapum Wanderley
Desigualdades Sem Sinal - Unsigned
„
Assim como instruções aritméticas sem sinal:
addu, subu, addiu
(na verdade instrução "don't overflow")
„
Existem instruções de desigualdade sem sinal:
sltu, sltiu
que realmente fazem comparação sem sinal!
0x80000000 < 0x7fffffff signed (slt, slti)
0x80000000 > 0x7fffffff unsigned (sltu,sltiu)
OAC – Ling. de Máquina – Aritmética Computacional - 10
Juliana F Camapum Wanderley
5
Panorama
„
Loading/Storing Bytes
„
Instruções MIPS Signed vs. Unsigned
„
Pseudo-instructions
„
Multiplicação/Divisão
„
Ponteiros em Linguagem Assembly
OAC – Ling. de Máquina – Aritmética Computacional - 11
Juliana F Camapum Wanderley
Verdadeira Linguagem Assembly
„
„
Pseudo-instrução: Uma instrução MIPS que não
se transforma diretamente em uma instrução em
linguagem de máquina.
O que acontece com as pseudo-instruções?
„
„
Elas são quebradas pelo assembler em várias
instruções MIPS "reais".
Mas o que é uma instrução "real" MIPS?
OAC – Ling. de Máquina – Aritmética Computacional - 12
Juliana F Camapum Wanderley
6
Exemplos de Pseudo-instruções
„
Move Registrador: move reg2,reg1
Expande para:
„
add reg2,$zero,reg1
Load Imediato:
Se o valor é de 16 bits:
li reg,value
ori reg,$zero,value
senão:
lui reg,upper 16 bits of value
ori reg,$zero,lower 16 bits
OAC – Ling. de Máquina – Aritmética Computacional - 13
Juliana F Camapum Wanderley
Verdadeira Linguagem Assembly
„
Problema:
„
„
„
Quando quebra uma pseudo-instrução, o assembler
pode precisar utilizar um registrador extra.
Se for usado qualquer registrador, será gravado por
cima do que o programa já havia colocado nele.
Solução:
„
„
Reservar um registrador ($1 ou $at) que o assembler
utilizará quando quebrar as pseudo-instruções.
Como o assembler pode utilizá-lo a qualquer
momento, não é seguro utilizar este registrador no seu
código assembly.
OAC – Ling. de Máquina – Aritmética Computacional - 14
Juliana F Camapum Wanderley
7
Exemplo de Pseudo-instrução
„
Instrução Rotate Right
ror
reg, value
Expande em:
srl
$at, reg, value
sll
reg, reg, 32-value
or
reg, reg, $at
0
0
Instrução No operation
nop
Expande em?
OAC – Ling. de Máquina – Aritmética Computacional - 15
Juliana F Camapum Wanderley
Linguagem Assembly Verdadeira
„
„
„
MAL (MIPS Assembly Language): o conjunto de
instruções que um programador pode usar para
codificar em MIPS; inclue as pseudo-instruções.
TAL (True Assembly Language): o conjunto de
instruções que pode realmente ser traduzida em
uma única instrução de linguagem máquina
Um programa deve ser convertido de MAL em
TAL antes de ser traduzido em 1s e 0s.
OAC – Ling. de Máquina – Aritmética Computacional - 16
Juliana F Camapum Wanderley
8
Panorama
„
Loading/Storing Bytes
„
Instruções MIPS Signed vs. Unsigned
„
Pseudo-instructions
„
Multiplicação/Divisão
„
Ponteiros em Linguagem Assembly
Juliana F Camapum Wanderley
OAC – Ling. de Máquina – Aritmética Computacional - 17
Multiplicação (1/3)
„
Exemplo em papel e lápis (unsigned):
Multiplicando
Multiplicador
1000
x1001
8
9
1000
0000
0000
+1000
01001000
„
m bits x n bits = produto (m + n bits)
OAC – Ling. de Máquina – Aritmética Computacional - 18
Juliana F Camapum Wanderley
9
Multiplicação (2/3)
„
Em MIPS, nós multiplicamos registradores; assim:
„
„
valor 32-bit x valor 32-bit = valor 64-bit
Sintaxe da Multiplicação:
„
„
mult register1, register2
Multiplica valores 32-bit nos registradores
especificados e coloca o produto de 64-bit em dois
registradores especiais de resultado:
„ coloca a metade superior em hi
„
„
coloca a metade inferior em lo
hi e lo são 2 registradores separados dos 32 de
propósito geral.
OAC – Ling. de Máquina – Aritmética Computacional - 19
Juliana F Camapum Wanderley
Multiplicação (3/3)
„
Exemplo:
„
em C:
„
em MIPS:
„
a = b * c;
b em $s2; c em $s3; a em $s0 e $s1 (já que ele pode ter até 64
bits)
mult $s2,$s3 # b*c
„
mfhi $s0
# upper half of
# product into $s0
mflo $s1
# lower half of product into $s1
Nota: Freqüentemente, nós só precisamos a metade inferior do
produto.
OAC – Ling. de Máquina – Aritmética Computacional - 20
Juliana F Camapum Wanderley
10
Divisão (1/3)
„
Exemplo com lápis e papel (unsigned):
1001
Quociente
Divisor
Dividendo
1001010|1000
____-1000
10
101
1010
-1000
10
Sobra
(ou resultado Modulo)
„ Dividendo = Quociente x Divisor + Sobra
OAC – Ling. de Máquina – Aritmética Computacional - 21
Juliana F Camapum Wanderley
Divisão (2/3)
„
Sintaxe da Divisão:
„
„
„
div register1, register2
Divide o valor 32-bits no registrador 1 pelo valor
32-bits no registrador 2:
„
coloca sobra da divisão em hi
„
coloca quociente da divisão em lo
Veja que isto pode ser utilizado para implementar
tanto o operador divisão (/) quanto o operador
módulo (%) da linguagem C.
OAC – Ling. de Máquina – Aritmética Computacional - 22
Juliana F Camapum Wanderley
11
Divisão (3/3)
„
Exemplo:
em C:
a = c / d;
b = c % d;
„
em MIPS:
„
„
a em $s0; b em $s1; c em $s2; e d em $s3
div $s2,$s3
mflo $s0
mfhi $s1
# lo = c/d, hi = c%d
# pega quociente
# pega sobra
OAC – Ling. de Máquina – Aritmética Computacional - 23
Juliana F Camapum Wanderley
Mais Instruções de don’t Overflow
„
Adicionalmente, MIPS tem versões destas
duas instruções aritméticas que não
sinalizam ‘overflow’
„
Muito utilizada para operandos sem sinal:
multu
divu
OAC – Ling. de Máquina – Aritmética Computacional - 24
Juliana F Camapum Wanderley
12
Panorama
„
Loading/Storing Bytes
„
Instruções MIPS Signed vs. Unsigned
„
Pseudo-instructions
„
Multiplicação/Divisão
„
Ponteiros em Linguagem Assembly
OAC – Ling. de Máquina – Aritmética Computacional - 25
Juliana F Camapum Wanderley
Problemas Comuns com Ponteiros
1. Algumas pessoas não entendem a distinção entre
x = y e *x = *y
2. Alguns não entendem os efeitos de
p = &x
e os resultados subseqüentes de atribuição através
de referências de p, ou da alocação de x.
OAC – Ling. de Máquina – Aritmética Computacional - 26
Juliana F Camapum Wanderley
13
Endereço vs. Valor
„
„
Conceito fundamental de Ciência da Comp.
Mesmo em planilhas de cálculo: selecione a
célula A1 para usar na célula B1
1
2
A
B
100 100

Você quer colocar o endereço da célula A1 na fórmula
(=A1) ou o valor de A1 (100)?

Diferença? Quando muda A1, células que usam o
endereço mudam, mas não as células com o valor
antigo.
OAC – Ling. de Máquina – Aritmética Computacional - 27
Juliana F Camapum Wanderley
Código Assembly para Implementar Ponteiros
„
referenciando ponteiros => transferência de
dados em assembly.
„
„
... = ... *p ...; => load
(pegue valor da localização apontada por p)
load word (lw) se for ponteiro para inteiro,
load byte unsigned (lbu) se for ponteiro para char
*p = ...;
=> store
(coloca o valor na localização apontada por p)
OAC – Ling. de Máquina – Aritmética Computacional - 28
Juliana F Camapum Wanderley
14
Código Assembly para implementar Ponteiros
c é int, tem valor 100, na memória no endereço
0x10000000, p em $a0, x em $s0
p = &c; /* p = end. 0x10000000 */
x = *p; /* x = 100 (conteúdo de p) */
*p = 200; /* c = 200 */
# p = &c; /* p = end. 0x10000000 */
lui $a0,0x1000 # p = 0x10000000
# x = *p; /* x = 100 (conteúdo de p) */
lw $s0, 0($a0) # referenciando p
# *p = 200; /* c (conteúdo de c) = 200 */
addi $t0,$0,200
sw
$t0, 0($a0) # referenciando p
OAC – Ling. de Máquina – Aritmética Computacional - 29
Juliana F Camapum Wanderley
Registradores e Ponteiros
„
Registradores não tem endereços
=> registradores não podem ser apontados
=> não se pode alocar uma variável a um
registrador se ela pode ter um ponteiro para ela
OAC – Ling. de Máquina – Aritmética Computacional - 30
Juliana F Camapum Wanderley
15
C vs. Asm com Aritmética de Ponteiros
int strlen(char *s) {
char *p;
p = s;
/* p aponta para string */
while (*p != \0)
p++;
/* aponta para o próximo caractere */
return p - s;
/* end - start */
}
mov $t0,$a0
lbu $t1,0($t0)
# referência a p
beq $t1,$zero, Exit
Loop:
addi $t0,$t0,1
# p++
lbu $t1,0($t0)
# referência a p
bne $t1,$zero, Loop
Exit:
sub $v0,$t0,$a0
jr
$ra
OAC – Ling. de Máquina – Aritmética Computacional - 31
Juliana F Camapum Wanderley
"E, concluindo..."
„
MIPS Signed v. Unsigned
„
Faz/Não Faz extensão de sinal (lb, lbu)
„
Não sinaliza overflow (addu, addiu, subu, multu, divu)
„
Faz comparação signed/unsigned (slt,slti/sltu,sltiu)
„
Assembler usa $at para transformar MAL em TAL
„
Instruções MIPS mult/div usam registradores hi, lo
„
Referenciando Ponteiros diretamente suportado
como load/store.
OAC – Ling. de Máquina – Aritmética Computacional - 32
Juliana F Camapum Wanderley
16
Organização e Arquitetura de Computadores
Aula 10 – Ponto Flutuante
Parte I
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Ponto Flutuante – Parte I - 1
Juliana F Camapum Wanderley
Panorama
n
Números em Ponto Flutuante
n
Motivação: Notação Científica Decimal
n
n
Notação Científica Binária
Representação Ponto Flutuante no computador
n
Maior Faixa, Precisão
n
Conversão Decimal p/ Ponto Flutuante e vice versa
n
Grande Idéia: Tipo não associado com dados
n
Instruções MIPS p/ Ponto Flutuante, Registradores
OAC – Ponto Flutuante – Parte I - 2
Juliana F Camapum Wanderley
1
Revisão de Números
n
Computadores são feitos para lidar com números
n
O que nós podemos representar com N bits?
n
Inteiros Sem sinal:
0
n
n
a
2N - 1
Inteiros com Sinal (Complemento de Dois)
-2(N-1) a
n
2(N-1) - 1
Juliana F Camapum Wanderley
OAC – Ponto Flutuante – Parte I - 3
Outros Números
n
E os outros números?
n
Números muito grandes?
n
n
(0,666666666. . .)
21/2
(1,414213562373. . .)
Transcendentais
n
n
2/3
Irracionais
n
n
0,0000000110 (1,010 x 10-8) cm
Racionais (padrão repetitivo)
n
n
3.155.760.000 10 (3,1557610 x 109)
Números muito pequenos? (diâmetro atômico)
n
n
(segundos/século)
e (2,718...),
π (3,141...)
Todos representados em notação científica
OAC – Ponto Flutuante – Parte I - 4
Juliana F Camapum Wanderley
2
Revisão de Notação Científica
mantissa
expoente
6,02 x
1023
ponto decimal
radical (base)
n Forma Normalizada: sem zeros à frente
(exatamente um dígito à esquerda do ponto decimal)
n Alternativas para se representar 1/1.000.000.000
n
Normalizada:
1,0 x 10-9
n
Não normalizada:
0,1 x 10-8 ou 10,0 x 10-10
Juliana F Camapum Wanderley
OAC – Ponto Flutuante – Parte I - 5
Notação Científica para Números Binário
Mantissa
expoente
1,0dois x 2-1
"ponto binário" radical (base)
n
A aritmética do computador que suporta isto é
chamada de ponto flutuante, porque ela
representa números onde o ponto binário não é
fixo, como é o caso dos inteiros.
n
Declaramos tais variáveis como float em C.
OAC – Ponto Flutuante – Parte I - 6
Juliana F Camapum Wanderley
3
Representação de Ponto Flutuante (1/2)
n
Formato Normal:
+1.xxxxxxxxxxdois* 2yyyy dois
n
Múltiplo do Tamanho da Palavra (32 bits)
31 30
23 22
S Expoente
1 bit 8 bits
n S representa Sinal
Significando
23 bits
0
Expoente representa y’s
Significando representa x’s
n
Representa números tão pequenos quanto
2,0 x 10-38 até tão grande quanto 2,0 x 1038
OAC – Ponto Flutuante – Parte I - 7
Juliana F Camapum Wanderley
Representação de Ponto Flutuante (2/2)
n
E se o resultado for muito grande? (> 2,0x1038 )
n
n
n
Overflow => Expoente maior do que pode ser
representado com os 8 bits do campo Expoente
E se for muito pequeno? (< 2,0x10 -38 )
n
n
n
Overflow!
Underflow!
Underflow => Expoente negativo maior do que pode ser
representado com os 8 bits do campo Expoente
Como reduzir as chances de overflow ou underflow?
OAC – Ponto Flutuante – Parte I - 8
Juliana F Camapum Wanderley
4
Representação de PF de Precisão Dupla
n
Próx. Múltiplo do Tamanho de Palavra (64 bits)
31 30
S
20 19
Expoente
1 bit
11 bits
0
Significando
20 bits
Significando (cont’d)
32 bits
n
Precisão Dupla (vs. Precisão Simples)
n
n
n
Variável C declarada como double
Representa números quase tão pequenos quanto
2,0 x 10-308 e quase tão grandes como 2,0 x 10308
Mas a vantagem principal é a maior precisão devido a um
significando maior.
Juliana F Camapum Wanderley
OAC – Ponto Flutuante – Parte I - 9
Padrão IEEE 754 para Ponto Flutuante (1/4)
n
Precisão Simples e Precisão Dupla Similares
n
Bit Sinal:
n
Significando:
n
n
n
1 significa negativo
0 significa positivo
Para acomodar mais bits, o primeiro 1 é implícito para
números normalizados
1 + 23 bits simples, 1 + 52 bits dupla
sempre verdade: 0 < Significando < 1 (para números
normalizados)
OAC – Ponto Flutuante – Parte I - 10
Juliana F Camapum Wanderley
5
Padrão IEEE 754 para Ponto Flutuante (2/4)
n
n
n
n
Kahan: números PF deveriam ser utilizados mesmo se não
houvesse um HW específico; p.ex, para ordenar registros
com PF utilizando comparação de inteiros.
Quebrar PF em 3 partes: comparar os sinais, então
comparar os expoentes, então comparar os significandos.
Deveria ser rápido; uma única comparação se possível,
especialmente para números positivos
Então deve-se ordenar:
n
Bit de mais alta ordem é bit de sinal ( negativo < positive)
n
A seguir, expoente, então maior expoente => número maior
n
Por último, o significando: expoentes iguais => número maior
Juliana F Camapum Wanderley
OAC – Ponto Flutuante – Parte I - 11
Padrão IEEE 754 para Ponto Flutuante (3/4)
n
Expoente Negativo?
n
Complemento de 2? 1,0 x 2-1 vs 1,0 x2+1 (1/2 vs. 2)
1/2 0 1111 1111 000 0000 0000 0000 0000 0000
2 0 0000 0001 000 0000 0000 0000 0000 0000
n
Esta notação utilizando inteiros:
n
n
comparação de 1/2 vs. 2 faz 1/2 > 2!
Se ao invés, usar a notação que 0000 0001 é o maior negativo e
1111 1111 é o maior positivo
n
1,0 x 2-1 vs. 1,0 x2+1
(1/2 vs. 2)
1/2 0 0111 1110 000 0000 0000 0000 0000 0000
2 0 1000 0000 000 0000 0000 0000 0000 0000
OAC – Ponto Flutuante – Parte I - 12
Juliana F Camapum Wanderley
6
Padrão IEEE 754 para Ponto Flutuante (4/4)
n
Chamada Notação Desviada, onde o desvio é um número
subtraído para se ter o número real
n
n
n
n
IEEE 754 usa desvio de 127 para precisão simples.
Subtrair 127 do campo Expoente para se ter o valor real do
expoente.
1023 é o desvio para precisão dupla
Sumário (precisão simples):
31 30
23 22
S Expoente
1 bit
n
(-1)S
n
8 bits
x (1 + Significando) x
0
Significando
23 bits
2(Expoente -127)
Precisão dupla idêntico, exceto que o desvio do expoente é 1023.
OAC – Ponto Flutuante – Parte I - 13
Juliana F Camapum Wanderley
Entendendo o Significando (1/2)
n
Método 1 (Frações):
n
n
n
Em decimal: 0,34010 => 34010/100010
=> 3410/10010
Em binário: 0,1102 => 1102/10002 = 610/810
=> 112/1002 = 310/410
Vantagem:
n
n
menos puramente numérica, mais orientada ao
pensamento;
este método usualmente ajuda as pessoas a entenderem
melhor o significado do significando
OAC – Ponto Flutuante – Parte I - 14
Juliana F Camapum Wanderley
7
Entendendo o Significando (2/2)
n
Método 2 (Valor da posição):
n
n
n
n
n
Converter da notação científica
Em decimal: 1,6732 = (1x100) + (6x10-1) + (7x10-2)
+ (3x10-3) + (2x10-4)
Em binário: 1,1001 = (1x20) + (1x2-1) + (0x2-2) +
(0x2-3) + (1x2-4)
A interpretação do valor em cada posição estende-se
além do ponto decimal/binário.
Vantagem: bom para rapidamente se calcular o valor
do significando; use este método para traduzir
número PF.
OAC – Ponto Flutuante – Parte I - 15
Juliana F Camapum Wanderley
Exemplo: Convertendo PF Binário para Decimal
0 0110 1000 101 0101 0100 0011 0100 0010
n
Sinal: 0 => positivo
n
Expoente:
n
n
0110 1000dois = 104dez
n
Ajuste do desvio: 104 - 127 = -23
Significando:
n
n
1 + 1x2-1+ 0x2-2 + 1x2-3 + 0x2- 4 + 1x2-5 +...
=1+2-1+2-3 +2-5 +2- 7 +2-9 +2-14 +2- 15 +2-17 +2-22
= 1,0 + 0,666115
Representa: 1,666115 dez * 2-23 ~ 1,986 * 10 -7
n
(cerca de 2/10.000.000)
OAC – Ponto Flutuante – Parte I - 16
Juliana F Camapum Wanderley
8
Continuando o Exemplo: Binário para ???
0011 0100 0101 0101 0100 0011 0100 0010
n
Converter Binário Complemento de 2 para Inteiro:
229+228+226+222+2 20+218 +216+214+29+28 +26+ 21 = 878.003.010dez
n
Converter Binário para Instrução:
0011 0100 0101 0101 0100 0011 0100 0010
13
2
21
17218
ori $s5, $v0, 17218
n
Converter Binário para ASCII:
0011 0100 0101 0101 0100 0011 0100 0010
4
U
C
B
Juliana F Camapum Wanderley
OAC – Ponto Flutuante – Parte I - 17
Grande Idéia: Tipo não associado ao Dado
0011 0100 0101 0101 0100 0011 0100 0010
n O que este padrão de bit significa:
n
1,986 * 10-7? 878.003.010?
ori $s5, $v0, 17218?
“4UCB”?
n Dados podem ser qualquer coisa; a operação da
instrução que acessa o operando determina o seu
tipo!
n
Conseqüência do conceito de programa
armazenado: instruções armazenadas como
números
OAC – Ponto Flutuante – Parte I - 18
Juliana F Camapum Wanderley
9
Convertendo Decimal para PF (1/3)
Caso simples: Se o denominador é uma potência
de 2 (2, 4, 8, 16, etc.), então é fácil.
n
Mostrar representação MIPS de –0,75
n
n
-0,75 = -3/4
n
-11dois/100dois = -0,11dois
n
Normalizado para –1,1dois x 2-1
n
(-1)S x (1 + Significando) x 2(Expoente -127)
(-1)1 x (1 + ,100 0000 ... 0000) x 2(126-127)
n
1 0111 1110 100 0000 0000 0000 0000 0000
OAC – Ponto Flutuante – Parte I - 19
Juliana F Camapum Wanderley
Convertendo Decimal para PF (2/3)
n
Caso não tão simples: Se o denominador não é
uma potência de 2.
n
n
n
Então nós não podemos representar o número
precisamente; mas é por isso que nós temos tantos
bits no significando: para precisão.
Uma vez que temos o significando, normalizar um
número para se ter o expoente é fácil.
Então, como achamos o significando de um número
sem fim?
OAC – Ponto Flutuante – Parte I - 20
Juliana F Camapum Wanderley
10
Convertendo Decimal para PF (3/3)
n
Fato: Todos os números racionais tem um padrão
repetitivo quando escritos na forma decimal.
n
Fato: Isto se aplica também a binários.
n
Para finalizar a conversão:
n
n
n
Escrever o número binário com o padrão repetitivo.
Cortá-lo após número correto de bits (diferente para
precisão simples e dupla).
Deduzir os campos Sinal, Expoente e Significando.
OAC – Ponto Flutuante – Parte I - 21
Juliana F Camapum Wanderley
Exemplo (1/2)
n
Como representar 1/3 em MIPS?
n
1/3
= 0,33333...10
= 0,25 + 0,0625 + 0,015625 + 0,00390625 +
0,0009765625 + ...
= 1/4 + 1/16 + 1/64 + 1/256 + 1/1024 + ...
= 2-2 + 2-4 + 2-6 + 2-8 + 2-10 + ...
= 0,0101010101... 2 * 20
= 1,0101010101... 2 * 2-2
OAC – Ponto Flutuante – Parte I - 22
Juliana F Camapum Wanderley
11
Exemplo (2/2)
n
Sinal: 0
n
Expoente = -2 + 127 = 12510= 011111012
n
Significando = 0101010101...
0 0111 1101 0101 0101 0101 0101 0101 010
OAC – Ponto Flutuante – Parte I - 23
Juliana F Camapum Wanderley
Representação para +/- Infinito
n
n
Em PF, divisão por zero deveria produzir +/infinito, não overflow.
Por quê?
n
n
n
OK para se fazer cálculos avançados com infinito;
p.ex., X/0 > Y pode ser uma comparação válida
Pergunte aos experts de matemática
IEEE 754 representa +/- infinito
n
Maior expoente positivo reservado para infinito.
n
Significando todo zero.
OAC – Ponto Flutuante – Parte I - 24
Juliana F Camapum Wanderley
12
Representação 0
n
Representar 0?
n
expoente todo zero
n
significando todo zero
n
E o sinal?
n +0: 0 00000000 00000000000000000000000
n -0: 1 00000000 00000000000000000000000
n
Por que dois zeros?
n
Ajuda em algumas comparações de limite.
n
Pergunte aos experts em matemática.
Juliana F Camapum Wanderley
OAC – Ponto Flutuante – Parte I - 25
Números Especiais
n
O que nós definimos até agora?
(Single Precision)
Expoente
Significando
Objeto
0
0
0
0
não zero
???
1-254
qq coisa
+/- num. PF
255
0
+/- infinito
255
não zero
???
OAC – Ponto Flutuante – Parte I - 26
Juliana F Camapum Wanderley
13
Adição em PF
n
Muito mais difícil do que com inteiros.
n
Não pode simplesmente somar os significandos
n
Como se faz?
n
n
De-normalizar para igualar expoentes
n
Soma significandos para ter um resultante.
n
Manter o mesmo expoente
n
Normaliza (possivelmente mudando expoentes)
Nota: Se os sinais diferem, realiza-se uma subtração ao
invés da adição.
OAC – Ponto Flutuante – Parte I - 27
Juliana F Camapum Wanderley
Subtração PF
n
Similar à adição
n
Como nós fazemos?
n
De-normalizar para igualar expoentes
n
Subtrair significandos
n
Manter o mesmo expoente
n
Normalizar (possivelmente mudando expoente)
OAC – Ponto Flutuante – Parte I - 28
Juliana F Camapum Wanderley
14
Adição/Subtração PF
n
Problemas na implementação de add/sub PF:
n
n
n
Se os sinais diferem para add (ou mesmo para
sub), qual será o sinal do resultado?
Questão: Como nós integramos isto na unidade
de aritmética inteira?
Resposta: Nós não integramos!
OAC – Ponto Flutuante – Parte I - 29
Juliana F Camapum Wanderley
Arquitetura MIPS para Ponto Flutuante (1/4)
n
Instruções separadas para ponto flutuante:
n
n
n
Precisão Simples:
add.s, sub.s, mul.s, div.s
Precisão Dupla:
add.d, sub.d, mul.d, div.d
Estas instruções são muito mas complicadas do
que suas contrapartidas inteiras, de modo que
devem demorar muito mais.
OAC – Ponto Flutuante – Parte I - 30
Juliana F Camapum Wanderley
15
Arquitetura MIPS para Ponto Flutuante (2/4)
n
Problemas:
n
n
n
n
É ineficiente ter instruções diferentes que levam
quantidades de tempo tão vastamente diferente.
Geralmente, uma parte específica de dados não
mudará de PF para int, ou vice versa, dentro de um
programa. Assim, somente um tipo de instrução
será utilizado nela.
Alguns programas não fazem nenhum cálculo em
ponto flutuante.
Precisa-se de muito hardware relativamente a
inteiros para se fazer Ponto Flutuante rápido.
OAC – Ponto Flutuante – Parte I - 31
Juliana F Camapum Wanderley
Arquitetura MIPS para Ponto Flutuante (3/4)
n
n
Solução de 1990: Fazer um chip completamente
separado que trata somente de PF.
Coprocessador 1: chip PF
n
n
n
n
contém 32 registradores de 32-bit: $f0, $f1, ...
maior parte dos registradores especificados nas
instruções .s e.d se referem a este conjunto.
Load e Store separados: lwc1 e swc1
(“load word coprocessor 1”, “store ...”)
Precisão Dupla: por convenção, pares par/ímpar
contém PF PD: $f0/$f1, $f2/$f3, ... , $f30/$f31
OAC – Ponto Flutuante – Parte I - 32
Juliana F Camapum Wanderley
16
Arquitetura MIPS para Ponto Flutuante (4/4)
n
n
Computador de 1990 realmente contém múltiplos chips
separados:
n
Processador: todas as coisas normais;
n
Coprocessador 1: PF e somente PF;
n
mais coprocessadores?… Sim, mais tarde
n
Hoje, chips baratos pode deixar de fora HW de PF
Instruções para mover dados entre o processador principal
e os coprocessadores:
n
mfc0, mtc0, mfc1, mtc1, etc.
OAC – Ponto Flutuante – Parte I - 33
Juliana F Camapum Wanderley
Coisas para se Lembrar
n
n
n
Números PF aproximam valores que queremos utilizar.
Padrão IEEE 754 para PF é uma tentativa quase que
universalmente aceita para se padronizar a interpretação de
tais números
Novos registradores MIPS ($f0-$f31), instruções:
n
n
n
Precisão Simples (32 bits, 2x10-38...2x10 38):
add.s, sub.s, mul.s, div.s
Precisão Dupla (64 bits , 2x10-308...2x10308):
add.d, sub.d, mul.d, div.d
Tipo não é associado com dados, bits não tem significado
exceto em dado contexto.
OAC – Ponto Flutuante – Parte I - 34
Juliana F Camapum Wanderley
17
Organização e Arquitetura de Computadores
Aula 11 – Ponto Flutuante
Parte II
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Ponto Flutuante – Parte II - 1
Juliana F Camapum Wanderley
Revisão
„
„
„
PF aproximam valores que queremos utilizar.
Padrão IEEE 754 para PF é uma tentativa de
padronização amplamente aceita de tais números.
Novos registradores MIPS ($f0-$f31), e instruções:
„
„
„
Precisão Simples (32 bits, 2x10-38… 2x1038):
mul.s, div.s
add.s, sub.s,
Precisão Dupla (64 bits , 2x10-308…2x10308):
mul.d, div.d
add.d, sub.d,
Tipo não está associado com dados; bits não têm
significado a exceto em um dado contexto.
OAC – Ponto Flutuante – Parte II - 2
Juliana F Camapum Wanderley
1
Panorama
„
Números Ponto Flutuante Especiais: NaN,
Não-normalizados
„
Modos de arredondamento IEEE
„
Falácias de Ponto Flutuante, hacks
Juliana F Camapum Wanderley
OAC – Ponto Flutuante – Parte II - 3
Números Especiais
„
O que temos definido até agora?
„
(Precisão Simples)
Expoente
0
0
1-254
255
255
OAC – Ponto Flutuante – Parte II - 4
Significando
0
nonzero
qq coisa
0
nonzero
Objeto
0
???
+/- fl. pt. #
+/- infinito
???
Juliana F Camapum Wanderley
2
Representação para Not a Number
„
„
Qual o resultado do cálculo:
sqrt(-4.0) ou
0/0?
„
Se infinito não é um erro, estes não deveriam ser também.
„
Chamados Not a Number (NaN)
„
Expoente = 255, Significando nonzero
Por que isto é útil?
„
Esperamos que NaNs ajude na depuração?
„
Eles se propagam: op(NaN,X) = NaN
„
Tudo bem se calculamos mas não usamos
„
Pergunte aos matemáticos
Juliana F Camapum Wanderley
OAC – Ponto Flutuante – Parte II - 5
Números Especiais (cont.)
„
O que temos definido até agora?
„
(Precisão Simples)
Expoente
0
0
1-254
255
255
OAC – Ponto Flutuante – Parte II - 6
Significando
0
nonzero
qq coisa
0
nonzero
Objeto
0
???
+/- fl. pt. #
+/- infinito
NaN
Juliana F Camapum Wanderley
3
Representação para Não-Normalizados (1/2)
„
Problema: Existe um gap entre os números PF
representáveis perto de 0.
„
O menor número positivo representável:
a = 1.0… 2 * 2-127 = 2-127
„
Segundo menor número positivo representável:
b = 1.000……1 2 * 2-127 = 2-127 + 2-150
„
a - 0 = 2-127
„
b - a = 2-150
Gap!
-
Gap!
b
+
0 a
Juliana F Camapum Wanderley
OAC – Ponto Flutuante – Parte II - 7
Representação para Não-Normalizados (2/2)
„
Solução:
„
Nós ainda não utilizamos o Expoente=0,
Significando não zero.
„
Número não normalizado: sem o 1 da frente.
„
Menor número positivo representável:
„
„
a = 2-150
Segundo menor número positivo representável:
„
b = 2-149
OAC – Ponto Flutuante – Parte II - 8
0
+
Juliana F Camapum Wanderley
4
Arredondamento
„
„
„
Quando se realiza cálculos matemáticos com números
reais, temos de nos preocupar com arredondamento.
O sistema real de cálculos matemáticos tem dois bits
de precisão extras, e então arredonda para se ter o
valor apropriado.
Arredondamento também ocorre quando se converte
um valor de precisão dupla para um de precisão
simples, ou na conversão de um PF para um inteiro.
OAC – Ponto Flutuante – Parte II - 9
Juliana F Camapum Wanderley
Modos de Arredondamento do IEEE
„
„
„
Arredonda para +infinito
„
SEMPRE arredonda para "cima": 2.001 -> 3
„
-2.001 -> -2
Arredonda para -infinito
„
SEMPRE arredonda para "baixo": 1.999 -> 1,
„
-1.999 -> -2
Trunca
„
„
Simplesmente descarta os últimos bits (arredonda para 0)
Arredonda para o par (mais próximo)
„
Arredondamento Normal, quase
OAC – Ponto Flutuante – Parte II - 10
Juliana F Camapum Wanderley
5
Arredonda para o par
„
„
„
Arredonde como você aprendeu na escola.
Exceto se o valor está exatamente na divisa, neste caso
arredondamos para o número PAR mais próximo.
„
2.5 -> 2
„
3.5 -> 4
Assegura consistência em cálculos.
„
„
„
Deste modo, metade das vezes arredondamos para cima e
na outra metade, para baixo.
Verifique com especialistas em estatística.
Este é o modo padrão de arredondamento.
OAC – Ponto Flutuante – Parte II - 11
Juliana F Camapum Wanderley
Forçando floats em ints e vice versa
„
„
(int) exp
„
Força e converte para o inteiro mais próximo.
„
afetado pelos modos de arredondamento.
„
i = (int) (3.14159 * f);
(float) exp
„
converte inteiro para o float mais próximo.
„
f = f + (float) i;
OAC – Ponto Flutuante – Parte II - 12
Juliana F Camapum Wanderley
6
int -> float -> int
if (i == (int)((float) i)) {
printf(true);
}
„
„
„
Não vai funcionar sempre
Valores inteiros grandes não têm uma representação PF
exata.
Do mesmo modo, pode-se arredondar para o valor
errado.
OAC – Ponto Flutuante – Parte II - 13
Juliana F Camapum Wanderley
float -> int -> float
if (f == (float)((int) f)) {
printf(true);
}
„
„
„
Não vai funcionar sempre
Valores pequenos de PF não têm boa representação
inteira.
Também erros de arredondamento
OAC – Ponto Flutuante – Parte II - 14
Juliana F Camapum Wanderley
7
Falácias em Ponto Flutuante
„
Soma e Subtração PF são associativas: FALSO!
„
„
„
„
x = – 1.5 x 1038, y = 1.5 x 1038, e z = 1.0
x + (y + z) = –1.5x1038 + (1.5x1038 + 1.0)= –1.5x1038 +
(1.5x1038) = 0.0
(x + y) + z = (–1.5x1038 + 1.5x1038) + 1.0= (0.0) + 1.0 =
1.0
Portanto, soma e subtração PF não são associativas!
„
„
Por que? resultado PF aproxima o resultado real!
Neste exemplo: 1.5 x 1038 é tão maior que 1.0 que na
representação PF 1.5 x 1038 + 1.0 ainda é 1.5 x 1038
OAC – Ponto Flutuante – Parte II - 15
Juliana F Camapum Wanderley
Coisas para se Lembrar
„
„
„
Padrão IEEE 754 para Ponto Flutuante: tenta acomodar o
máximo que se pode com:
„
+/- infinito, Not-a-Number (Nan), Não-Normalizados
„
4 modos de arredondamento
Conceito de Programa Armazenado: Tanto dados como o
código (instruções) são armazenados na mesma memória.
Tipo não está associado com dados, os bits não têm
nenhum significado intrínseco, somente no contexto em
que são manipulados.
OAC – Ponto Flutuante – Parte II - 16
Juliana F Camapum Wanderley
8
4.6 Multiplicação
• Multiplicando: 1000, Multiplicador: 1001
1000
x 1001
1000
0000
0000
1001____
1001000
• Número de dígitos: multiplicando +
multilicador.
• 16 bits x 16 bits = 32 bits.
• Algoritmo:
• Deslocamento para a esquerda.
• Soma, ou não soma, dependendo
do bit do multiplicando.
Veremos: 3 versões do algoritmo de
multiplicacação 32 x 32 bits.
1
Primeiro algoritmo
Algoritmo
2
Exemplos:
Mult. 2 números de 4 bits: 00102 e 00112.
Desvantagens
• ULA de 64 bits.
• 2 registradores de 64 bits.
Segunda versão do algoritmo
3
Algoritmo:
Exemplo
• Vantagens:
- ULA de 32 bits.
- 1 reg. de 64 bits.
4
• Terceiro Agoritmo
Produto0=
Produto0=
Produto0
5
Vantagens:
• ULA de 32 bits.
• Apenas 1 reg. de 64 bits.
Exemplo:
Multiplicação com Sinal
• Método simples:
• Converter o multiplicador e o
multiplicando para números positivos,
guardando os sinais originais.
• Fazer as 31 iterações, ignorando os
sinais.
• Trocar o sinal do produto se os sinais
do multiplicador e do multiplicando
forem diferentes.
6
• Outro método:
• Usar o mesmo algoritmo usando
extensão de sinal do produto:
11111110 x 00000011
O Algoritmo de Booth
• Bom para números com sinal.
• Há várias maneiras de se calcular um
produto com somas e subtrações.
• Outra forma:
7
• Método:
• Para os zeros mais à esquerda,
somar zeros.
• Para o primeiro 1: subtrair o dois.
• Nos outros 1’s: zeros.
• No próximo zero: somar.
• Exemplo:
• Objetivo: fazer mais deslocamento do
que somas.
• Seqüências de 1’s:
• Possíveis seqüências de 1’s:
8
• Varrer o multiplicador, e dependendo
do bit atual e do bit à sua direita:
• No LSB, utilizar um bit 0 imaginário à
direita.
• Exemplo de testes:
9
• Exemplo:
2 x –3 = 0010 x 1101 = 11111010
Para casa: mostrar por que o algoritmo
de Booth funciona.
Multiplicação por 2j por via de
deslocamentos: Ver livro.
10
Adição em Ponto Flutuante
Exemplo com 4 bits na mantissa.
Passo 1: Alinhar o ponto decimal do
número de maior expoente:
1,610 × 10-1=0,01610×101
Passo 2: somar a mantissa.
9,999+0,016=10,015dez
Passo 3: Se a soma não estiver
normalizada, normalizar.
Notar:
• O deslocamento do resultado pode
ser para a esquerda ou para a
direita.
• É necessário checar se, com o
deslocamento, não houve overflow.
1
Passo 4: Número é de 4 bits→resultado
apenas 4 bits: aproximar o último número
para o inteiro mais próximo.
• Algoritmo:
2
3
Hardware de soma em ponto flutuante:
Exemplo
Somar 0,5dez e – 0,4375.
4
Multiplicação em Ponto Flutuante
Exemplo: multiplicar 1,110×1010 e 9,200×10-5.
Passo 1: Somar o expoente. 10+(-5)=5
Mas como os números estão
representados com peso = 127:
137+122=259.
Erro: quando se soma os dois expoentes, se
soma o peso duas vezes.
Assim: subtrair 127 da soma:
Novo expoente = 137 + 122 – 127 = 132
(=5+127)
Passo 2: Multiplicar as mantissas:
1,110 x 9,200=10,212000
Passo 3: Normalizar o valor, e
arredondar para o número de dígitos da
mantissa.
10,212 x 105 = 1,0212 x 106.
5
Passo 5: Definir o sinal, com base nos
sinais do operando:
+1,021 x 106.
Exemplo: Multiplicar 0,5dez por
–0,4375dez.
Instruções de Ponto Flutuante no
MIPS
• Suporta o formato IEEE754 em precisão
simples e dupla (add.d).
• Soma: add.s e add.d.
• Subtração: sub.s e sub.d.
• Multiplicação: mult.s e mult.d.
• Divisão: div.s e div.d.
• Comparação c.x.x e c.x.d, onde x pode
ser iqual (eq), diferente (ne), menor
que (lt), menor ou igual a (le) maior que
(gt) e maior ou igual a (ge).
• Desvio em ponto flutuante verdadeiro
(bclt).
• Desvio em ponto flutuante falso (bclf).
6
• Registradores em ponto flutuante:
$f0, $f1, $f2, ..., $f31
• Instruções especiais de load e store:
lwcl e swcl
Exemplo:
• Entretanto: registradores de base para
dados em ponto flutuante:
registradores inteiros.
• Leitura: Exemplos em C.
• Leituras: Seções 4.9 até 4.12
7
Download