Nível de arquitetura do conjunto de instrução Capítulo 5
Nível ISA - Introdução Historicamente foi desenvolvido antes dos outros níveis Originalmente era o único nível É a interface entre o software e o hardware Os programas escritos em várias linguagens de alto nível são traduzidos para uma forma intermediária comum (nível ISA) O hardware é construído de tal forma que possa executar o nível ISA diretamente Define a interface entre os compiladores e o hardware
Nível ISA - Introdução O nível ISA é a interface entre os compiladores e o hardware. Compilador e hardware precisam entender a linguagem do nível ISA
Nível ISA - Introdução Quando surge um novo hardware, as perguntas a serem feitas pelos clientes potenciais são: É compatível com o hardware antigo ? Pode executar o SO antigo ? Executará todos o programas de aplicação já existentes sem a necessidade de modificação e recompilação ? Isto leva os projetistas de computador a manterem a mesma ISA entre modelos ou ao menos permitir compatibilidade
Nível ISA - Introdução Um hardware novo pode ser compatível com uma ISA antiga mas características do novo hardware precisam de software novo para serem exploradas Pode-se passar de um projeto com características implementadas a nível de microprograma para as mesmas características implementadas com execução direta no hardware Novo software para explorar tais características ISA compatível com programas antigos
Nível ISA - Visão Geral Propriedades O nível ISA é o modo como a máquina se apresenta a um programador de linguagem de máquina Código de nível ISA é o que um compilador produz, ignorando chamadas ao SO e linguagem de montagem simbólica Para produzir código de nível ISA, necessita-se saber O modelo de memória Quais e quantos são os registradores Quais tipos de dados e instruções estão disponíveis
Nível ISA - Visão Geral Propriedades Não são questões do nível ISA: Se a microarquitetura é microprogramada ou não o é Se tem paralelismo ou não Se é superescalar ou não Tais aspectos não são visíveis para o escritor de compilador Nível ISA especificado V9 SPARC Diferentes chips com preços variados capazes de rodar os mesmos programas de aplicação Nível ISA não especificado Chip Intel Pentium 4 Clonado
Nível ISA - Visão Geral Propriedades Na maioria das máquinas há no mínimo os modos Kernel (núcleo) Executa o SO Permite que todas as instruções sejam executadas Usuário Executa programas de aplicação Não permite que certas instruções sejam manipuladas diretamente E.g., manipulação da cache
Nível ISA - Visão Geral Modelo de Memória Todos os computadores dividem a memória em células de endereço consecutivos O tamanho de células mais comum é 8 bits Historicamente usadas células de 1 a 60 bits Uma célula de 8 bits é denominada byte Codificação ASCII levou a células de 8 bits Codificação UNICODE necessita de 16 bits
Nível ISA - Visão Geral Modelo de Memória Bytes são agrupados em palavras de 32 bits 4 bytes 64 bits 8 bytes Há instruções disponíveis para se manipular palavras inteiras
Nível ISA - Visão Geral Modelo de Memória Há arquiteturas que exigem palavras alinhadas em suas fronteiras Mais eficiente E.g., Pentium 4 Nível ISA permite endereçar palavras de forma não alinhada, o que causa mais acesso à memória Compatibilidade com o nível ISA de máquinas 8088 antigas Outras permitem endereçamento de palavras não alinhadas
Nível ISA - Visão Geral Modelo de Memória Palavra de 8 bytes em memória little-endian. (a) Alinhada. (b) Não alinhada. Algumas máquinas requerem que palavras na memória sejam alinhadas.
Visão geral do nível ISA do Pentium 4 Registradores primários do Pentium 4.
Visão geral do nível ISA da UltraSPARC III (1) Registradores gerais da UltraSPARC III.
Visão geral do nível ISA da UltraSPARC III (2) Operação das janelas de registrador da UltraSPARC III.
Visão geral do nível ISA do 8051 (a) Organização de memória em chip para o 8051. (b) Principais registradores do 8051.
Tipos de dados Uma questão fundamental é se há ou não há suporte de hardware para um tipo particular de dado O hardware espera um certo formato de inteiros e não funciona adequadamente quando recebe qualquer outra coisa E.g., Se o hardware somente suporta aritmética de 32 bits e é necessário um tipo de dado de 64 bits (dupla precisão), faz-se necessário dar suporte a nível de software
Tipos de dados Os tipos de dados podem ser divididos em numéricos e não numéricos Tipos numéricos: O principal entre os tipos numéricos são os inteiros Um inteiro de 32 bits com sinal pode manipular números positivos e negativos ( (2 ** 31) – 1) Para números não inteiros (e.g 3,2) são usados números de ponto flutuante Com comprimentos de 32, 64 ou 128 bits (dependendo da arquitetura) O bug do milêncio Y2K foi causado por programadores que objetivavam otimizar o uso recursos computacionais Usaram 2 dígitos decimais para o ano ao invés de 16 bits
Tipos de dados Os tipos de dados podem ser divididos em numéricos e não numéricos Tipos não numéricos: Computadores modernos são usados para aplicações não numéricas (e.g., e-mail, vídeo, web, fotos) São necessários tipos de dados muitas vezes não suportados pelo nível ISA Muitas vezes o nível ISA possui instruções para manipular cadeias de caracteres Valores booleanos Não há suporte a endereçar bits Mapas de bits onde uma palavra é usada para armazenar 32 valores booleanos Ponteiros Um ponteiro é um endereço de memória
Tipos de dados do Pentium 4 Tipos de dados numéricos do Pentium 4. Os tipos suportados estão marcados com x. Manipula bem inteiros de 8 ou 16 bits Possui numerosas instruções para efetuar operações aritméticas e boolenas Operandos não tem que estar alinhados na memória Desempenho melhor se os endereços de palavras forem múltiplos de 4 bytes Bom na manipulação de caracteres ASCII de 8 bits Instruções especiais para buscar e manipular caracteres
Tipos de dados da UltraSPARC III Tipos de dados numéricos da UltraSPARC III. Os tipos suportados estão marcados com x. É baseada em registradores Quase todas as instruções operam em registradores de 64 bits Tipos de dados de caracteres e cadeia de caracteres não são suportados por hardware, mas sim inteiramente por software
Tipos de dados numéricos do 8051. Os tipos suportados Tipos de dados do 8051 Tipos de dados numéricos do 8051. Os tipos suportados estão marcados com x. Todos os registradores tem 8 bits, inclusive ponteiros, caracteres Todo bit pode ser endereçado individualmente O bit zero é o mais à direita no byte Há instruções para bits individuais Ajustar, liberar, efetuar operações AND e OR Completar, mover e testar bits
Formatos de Instrução (1) Quatro formatos comuns de instrução: (a) Instrução sem endereço. (c) Instrução com dois endereços. (b) Instrução com um endereço. (d) Instrução com três endereços. Uma instrução consiste em um opcode geralmente com informações adicionais De onde vem os operandos e para onde vão os resultados O endereçamento define onde estão os operandos (seus endereços)
Formatos de Instrução (1) Instruções sempre possuem um opcode O opcode indica o que a instrução faz Endereços indicam onde estão os operandos
Formatos de Instruções (2) Algumas relações possíveis entre comprimento de instrução e de palavra. Um programa que consistem em n instruções de 16 bits, ocupa apenas metade da memória que um programa de n instruções de 32 bits É preciso contrabalançar o tamanho mínimo da instrução com o tempo requerido para decodificá-la e executá-la
Formatos de Instruções (2) Uma outra razão para minimizar o comprimento da instrução é a largura de banda da memória (bits/s) A capacidade de processamento dos processadores tem crescido mais rápido que a largura de banda da memória Processadores ficam ociosos e o gargalo é a largura de banda da memória O gargalo da largura de banda da memória diz respeito à RAM e a Cache
Formatos de Instruções (2) Instruções mais curtas significam um processador mais rápido Computadores modernos podem executar várias instruções por ciclo de relógio Buscar várias instruções por ciclo de relógio se torna imperativo O tamanho da cache de instruções é um importante critério de projeto para o desempenho
Expansão de Opcodes (1) Instrução com um opcode de 4 bits e três campos de endereço de 4 bits cada. Denomina-se expansão de opcode ao artifício utilizado pelos projetistas de computador ao contrabalancear o tamanho/quantidade de memória endereçável com a quantidade de instruções possíveis
Expansão de Opcodes (1) Instrução com um opcode de 4 bits e três campos de endereço de 4 bits cada. Neste projeto é possível 16 instruções de três endereços Seria ideal para uma CPU com 16 registradores
Expansão de Opcodes (2) Expansão de opcode que permite 15 instruções de três endereços, 14 instruções de dois endereços, 31 instruções de um endereço, e 16 instruções sem endereço. Os campos marcados com xxxx, yyyy e zzzz são campos de endereço de 4 bits.
Expansão de Opcodes (2) Instruções de 3 endereços tem um opcode de 4 bits Instruções de 2 endereços tem um opcode de 8 bits Instruções de 1 endereço tem um opcode de 12 bits Instruções sem endereço tem um opcode de 16 bits
Formatos das instruções do Pentium 4 Bastante complexo com 6 campos de tamanho variável, cinco dos quais opcionais Arquitetura evoluiu por muitas gerações mantendo opções desastrosas do início do projeto Formatos de instrução do Pentium 4.
Formatos das instruções do Pentium 4 Nas primeiras arquiteturas Intel, todos os opcodes tinham 1 byte 1 byte de prefixo usado extensivamente para modificar algumas instruções Com o tempo a Intel esgotou seus opcodes Um opcode extra OxFF foi designado como código de escape para permitir um segundo byte de instrução Instruções difíceis de decodificar Formatos de instrução do Pentium 4.
Formatos de instrução da UltraSPARC III Consiste inteiramente em instruções de 32 bits alinhadas na memória Instruções simples que especificam apenas uma única ação Uma instrução aritmética típicia especifica dois operandos fontes e um único registrador de destino Os formatos originais de instrução da SPARC.
Formatos de instrução do 8051 Possui 6 formatos de instruções simples As instruções são de 1, 2 ou 3 bytes 1 byte 2 bytes 3 bytes Formatos de instrução do 8051.
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento imediato Endereçamento direto Endereçamento de registrador Endereçamento indireto de registrador Endereçamento indexado Endereçamento de base indexado Endereçamento de pilha
Instrução imediata para carregar 4 no registrador 1. Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento imediato É o modo mais simples de uma instrução especificar seu operando O endereço realmente contém o operando em si e não uma informação que descreva onde o operando está Tem a vantagem de não exigir uma referência extra à memória para buscar o operando Operando imediato é buscado na memória juntamente com a instrução Desvantagem é que somente uma constante pode ser fornecida neste modo Instrução imediata para carregar 4 no registrador 1.
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento direto Um operando é indicado na memória através do seu endereço completo Neste caso a instrução sempre acessará a mesma localização da memória O endereço direto é usado para acessar variáveis globais cujos endereços são conhecidos no momento da compilação
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento de registrador É o mesmo que o endereçamento direto, mas especifica um registrador em vez de uma localização de memória Como os registradores são muito importantes, devido ao acesso rápido e endereços curtos, esse modo de endereçamento é o mais comum na maioria dos computadores Compiladores verificam quais variáveis serão mais acessadas e as colocam em um registrador E.g., o índice de um laço é posto em um registrador pelo compilador
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento de registrador Em arquiteturas carregue armazene, como a UltraSARC III quase todas as instruções usam exclusivamente o modo registrador A única vez em que o modo registrador não é usado é quando um operando é transferido da memória para um registrador Instrução LOAD ou do registrador para a memória Instrução STORE
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento indireto de registrador O operando que está sendo especificado vem da memória ou vai para a memória O endereço do operando na memória não está ligado à instrução (como no modo direto) O endereço do operando fica armazenado em um registrador O endereço do operando na instrução é na verdade um ponteiro
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento indireto de registrador Vantagens O endereço do operando na instrução faz referencia à memória sem pagar o preço por ter um endereço de memória completo na instrução Pode usar diferentes palavras de memória em diferentes execuções da instruções
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento indireto de registrador E.g., Um programa genérico em linguagem de montagem para calcular a soma dos elementos de um vetor.
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento indexado É o nome que se dá ao endereçamento de memória que fornece um registrador mais um deslocamento constante É útil para poder referenciar palavras de memória cujo deslocamento em relação a um registrador é conhecido.
Endereçamento Indexado (1) Programa genérico em linguagem de montagem para calcular a operação OR de Ai AND Bi para dois vetores de 1024 elementos. Tem-se dois vetores unidimensionais de 1.024 palavras cada, A e B Deseja-se calcular A[i] AND B[i] para todos os pares e então efetuar uma operação OR com esses 1.024 produtos booleanos para ver se há ao menos um par não zero no conjunto.
Endereçamento Indexado (2) Possível representação de MOV R4, A (R2). A Palavra de memória endereçada é A[0] no endereço 124300 A[1] no endereço 124300 A[2] no endereço 124300
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento de base indexado Algumas máquinas tem um modo de endereçamento no qual o endereço de memória é calculado somando dois registradores mais um deslocamento (opcional) Um dos registradores é a base e o outro é o índice LOOP: MOV R4,(R2+R5) AND R4,(R2+R6)
Endereçamento O Endereçamento permite indicar onde estão os operandos que fazem parte das instruções Modos de Endereçamento: Endereçamento de pilha
Notação Polonesa Invertida (1) A forma com o operador entre os operandos é chamada notação infixa x + y A forma com o operador após os operandos é denominada pós-fixa ou notação polonesa invertida x y + Vantagens da notação polonesa invertida sobre a notação infixa Na expressão de fórmulas algébricas, qualquer fórmula pode ser expressa sem parênteses
Notação Polonesa Invertida (1) Cada vagão ferroviário representa um símbolo na fórmula a ser convertida de notação infixa para notação polonesa invertida.
Notação Polonesa Invertida (2) Tabela de decisão usada pelo algoritmo de conversão da notação infixa para a notação polonesa invertida.
Notação Polonesa Invertida (3) Infixa Notação polonesa invertida Alguns exemplos de expressões infixas e seus equivalentes em notação polonesa invertida.
Avaliação de fórmulas em notação polonesa invertida Utilização de uma pilha para avaliar uma fórmula em notação polonesa invertida.
Ortogonalidade de Opcodes e modos de endereçamento (1) Projeto simples para formatos de instrução de uma máquina de três endereços.
Ortogonalidade de Opcodes e modos de endereçamento (2) Projeto simples para os formatos de instrução de uma máquina de três endereços.
Modos de endereçamento do Pentium 4 (1) Modos de endereçamento de 32 bits do Pentium 4. M[x] é a palavra de memória em x.
Modos de endereçamento do Pentium 4 (2) Acesso a a[i].
Discussão dos modos de endereçamento Comparação entre os modos de endereçamento.
Controle de laço (a) Laço do tipo “teste no final”. (b) Laço do tipo “teste no início”.
Registradores de dispositivo para um terminal simples. Entrada/Saída (1) Registradores de dispositivo para um terminal simples.
Exemplo de E/S programada. Entrada/Saída (2) Exemplo de E/S programada.
Sistema com controlador de DMA. Entrada/Saída (3) Sistema com controlador de DMA.
Instruções do Pentium 4 (1) Uma seleção de instruções de inteiros do Pentium 4.
Instruções da UltraSPARC III (1) Instruções de inteiros da UltraSPARC III primária.
Conjunto de instruções do 8051.
Conjunto de instruções do 8051.
Conjunto de instruções do 8051.
Conjunto de instruções do 8051.
Conjunto de instruções do 8051.
Fluxo de controle seqüencial e desvios Contador de programa como função do tempo (ajustada). (a) Sem desvios. (b) Com desvios.
Procedimentos Recursivos (1) Configuração inicial para o problema Torres de Hanói para cinco discos.
Procedimentos recursivos (2) Etapas requeridas para resolver o problema Torres de Hanói para três discos.
Procedimentos Recursivos (3) Etapas requeridas para resolver o problema Torres de Hanói para três discos.
Procedimentos Recursivos (4) Procedimento para resolver o problema Torres de Hanói.
Procedimentos Recursivos (5) Pilha em diversos pontos durante a execução da rotina do slide anterior.
Co-rotinas (1) Quando um procedimento é chamado, a sua execução sempre começa na primeira declaração do procedimento.
Co-rotinas (2) Quando uma co-rotina é reiniciada, sua execução começa na primeira declaração não executada na última chamada, e não no princípio.
Exemplo de seqüência temporal de várias interrupções.
Torres de Hanói em linguagem de montagem do Pentium 4 (1) Torres de Hanói para Pentium 4.
Torres de Hanói em linguagem de montagem do Pentium 4 (2) Torres de Hanói para Pentium 4.
Torres de Hanói em linguagem de montagem do Pentium 4 (3) Torres de Hanói para Pentium 4.
Torres de Hanói em linguagem de montagem UltraSPARC III (1) Torres de Hanói para UltraSPARC III.
Torres de Hanói em linguagem de montagem UltraSPARC III (2) Torres de Hanói para UltraSPARC III.
Reduzindo Referencias à Memória Registradores do Itanium 2.
Escalonamento de Instruções O pacote IA-64 contém três instruções.
Reduzindo Desvios Condicionais: Predicação (1) (a) Declaração if. (b) Código genérico de montagem para (a). (c) Instrução condicional.
Reduzindo Desvios Condicionais: Predicação (2) (a) Declaração if. (b) Código genérico de montagem para (a). (c) Execução condicional.
Reduzindo Desvios Condicionais: Predicação (3) (a) Declaração if. (b) Código genérico de montagem para (a). (c) Execução predicada.