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 SPEC89 (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. deMá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