Anotações da 2a Edição OBS: Essas anotações são adaptações do material suplementar (apresentações PPT) ao Livro do Hennessy e Patterson. Supõe-se que os estudantes tenham noções de lógica digital e linguagem assembly para o entendimento das aulas. 1 Parte 3 Baseado no Capítulo 2 – Computer Organization and Design – The Hardware and Software Interface, 4ª Ed. 2 Seja o programa em C // none of these allocate any storage #define MAX_SIZE 256 #define IF(a) if (a) { #define ENDIF } typedef struct { unsigned char red; // 'unsigned char' is an unsigned, 8-bit int unsigned char green; unsigned char blue; unsigned char alpha; } RGBa; // these allocate storage int i; int N = 20; char prompt[] = "Enter an integer:"; int A[MAX_SIZE]; int* pBArray; int BSize; RGBa background = {0xff, 0xff, 0xff, 0x0}; Fonte: http://www.cs.washington.edu/education/courses/cse378/03wi/lectures/mips-asm-examples.html 3 Layout da memória 4 Instruções • Instruções: palavras / vocabulário: conjunto de instruções • Programa armazenado: Dados e instruções de vários tipos podem ser armazenados como números (binários) na memória • Instruções estão em Linguagem de Máquina (assembly) – Muito Mais primitiva que linguagem de alto-nível => não há controles de fluxo sofisticados (for, while, etc...) – Muito restritivas => Instruções aritméticas do MIPS (visto mais adiante) • Nós iremos trabalhar com o MIPS Instruction Set Architecture (ISA) – Similar a outras arquiteturas desenvolvidas desde os 1980's – Usada pela NEC, Nintendo, Silicon Graphics, Sony – Foco nos princípios e não em detalhes específicos de ISA’s Objetivo: maximizar desempenho e minimizar custo, reduzir tempo de design! 5 Compilando códigos C em MIPS (1) compilador C a = b + c; d = a – e; add a, b, c sub d, a, e f = (g+h) – (i+j); add $t0, g, h add $t1, i, j sub f, $t0, $t1 1. 2. 3. 4. Compilador gera a(s) instrução(ões) correspondentes – assembly Formato bastante rígido: add <soma, parcela, parcela> Operandos em registradores Registradores temporários 6 Compilando códigos C em MIPS (2) • • • Registradores armazenam variáveis do programa Associação variável ↔ registrador feita pelo compilador E se as variáveis f, g, h, i, j forem associadas aos registradores $s0, $s1, $s2, $s3, $s4 como ficaria o código? compilador C f = (g+h) – (i+j); 1. 2. 3. add $t0, $s1, $s2 add $t1, $s3, $s4 sub $s0, $t1, $t0 Registradores de tamanho de 1 palavra: 32 bits Número limitado: 32 (numerados de 0 a 31 – 5 bits) Registradores temporários 7 Compilando códigos C em MIPS (3) • Instruções de transferência de dados Memória ↔ registrador (CPU) – Para acessar um dado, é necessário um endereço • Dois movimentos básicos: load (traz da ...) e store (leva para a memória) • • No MIPS, acesso somente a blocos (palavras) de 32 bits (4 bytes) Estruturas mais complexas tipo vetores e matrizes? – Endereço de base e deslocamento 8 Compilando códigos C em MIPS (4) • Seja A um vetor de 100 palavras e as variáveis g e h associadas aos registradores $s1 e $s2 como antes. O endereço de base de A está armazenado no registrador $s3 compilador C g = h + A[8]; Problema: Como encontrar valor armazenado em A[8]? lw $t0, 32($s3) add $s1, $s2, $t0 9 Compilando códigos C em MIPS (5) • Seja A um vetor de 100 palavras e a variável h associada ao registrador $s2. O endereço de base de A está armazenado no registrador $s3 compilador C A[12] = h + A[8]; lw $t0, 32($s3) add $t0, $s2, $t0 sw 1. 2. 3. $t0, 48($s3) Uso do registrador temporário para armazenar resultado parcial Acesso aos elementos do vetor: base e offset A ordem dos operandos não é alterada para lw e sw 10 Compilando códigos C em MIPS (6) • • Operandos constantes e imediatos: muito frequentes... Seja a uma variável (contador de um programa, por ex) associada ao registrador $s1. compilador C a = a + 1; Outra opção? addi $s1, $s1, 1 lw $t0, EndConst_1 add $s1, $s1, $t0 Por que é pior? Frequência de uso desse tipo de instrução? – Fazer os casos comuns serem rápidos! Faz sentido ter uma instrução do tipo subi 11 Alternativas para o Conjunto de Instruções Queremos executar: c = a + b 12 Impactos para o ISA • Muitas formas de endereçamento levam a tamanhos variados de instrução: – Flexibilidade para codificação – Complexidade para decodificação – Densidade das instruções (no. de bits) – No. de acessos à memória – Quantidade de “trabalho” por instrução – Operandos podem estar na própria instrução 13 Características associadas a um Conj. Inst. 1. Como interpretar os bits da memória: – Little ou big endian – Acesso a palavras ou a bytes 2. Endereçamento de operandos 3. Tipos de operações suportadas 4. Tamanhos e tipos de operandos Como definir um conjunto de instruções “ideal” para uma arquitetura? 14 Até agora, para o ISA do MIPS... 15 Algumas reflexões sobre a escolha do conjunto de instruções para uma arquitetura... 16 Sobre os modos de endereçamento 17 Exemplos de modos de endereçamento (1) 18 Exemplos de modos de endereçamento (2) 19 Com que frequência uso cada modo? - SPEC89 sobre o VAX (um pouco antigo, mas muito ilustrativo...) - Vários outros exemplos comparativos na referência básica 20 Distância (em bits) dos deslocamentos 21 Uso dos operandos imediatos 22 Tamanho dos operandos imediatos 23 Tipos/Tamanhos de operandos 24 Voltando à pergunta inicial Como definir um conjunto de instruções “ideal” para uma arquitetura? Balanceamento das seguintes características “desejáveis”: 1. Ter mais registradores e modos de endereçamento que possível 2. Avaliar o impacto do tamanho dos registradores e modos de endereçamento no tamanho médio das instruções e do programa 3. Ter instruções codificadas em formatos que facilitem a sua manipulação pelo hardware de controle da CPU (tamanhos fixos ou múltiplos bytes) • Soluções MIPS => ver Capítulo 2. 25 Possibilidades de Operadores no Conj. Inst. 26 Instruções mais usadas 27 Números de Operandos em ISAs 28