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 • • • • De onde surgiu esse código? Como ele foi compilado? Como ele foi parar na memória? Como ele começa a ser executado? – Isso não faz parte do curso, mas vamos “abrir um parêntese” para uma explicação rápida desses conceitos... 5 6 Processo de compilação típico 7 Iniciando um programa 8 Linkagem de arquivos objeto 9 Carregando um programa executável Para carregar um executável, o SO realiza os seguintes passos: 1. 2. 3. 4. 5. 6. Lê o cabeçalho do arquivo executável e determina o tamanho dos segmentos de texto (código) e dados Cria um espaço de endereçamento grande o suficiente para texto (código) e dados Copia instruções e dados do arquivo executável para a memória Copia os parâmetros (seu houver) do programa principal para a pilha Inicializa os registradores e "seta" o ponteiro da pilha para a primeira alocação livre Salta para a "rotina de start-up" que copia os parâmetros nos registradores de argumentos e chama a rotina principal do programa 10 Ao final do processo... • • Dados e instruções (MIPS, em nosso caso) estarão na memória Mais questões: – – – – Qual tipo de instrução? Qual tipo de dado? Fluxo de execução? Entradas e saídas? 11 12 Instruções na Linguagem MIPS 13 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! 14 Instruções e Dados na memória • Dados e instruções (binários) estão na memória principal • Foram gerados a partir de um processo de compilação e carga na memória • Alocação de espaço feita durante o processo de carga – Compilador indica quantidade em bytes para as variáveis – Sequência de instruções – Endereço (relativo ao segmento do código compilado) de variáveis, labels, rotinas, etc. • Uso frequente de instruções de LOAD (STORE) para trazer (levar) dados da (para) memória para (dos) os registradores • Exemplos de acesso a variáveis usando a liguagem MIPS 15 Compilando códigos C em MIPS (1) compilador C a = b + c; d = a – e; add $s1,$s2,$s3 sub $s5,$s1,$s4 f = (g+h) – (i+j); add $t0,$s0,$s1 add $t1,$s2,$s3 sub $s4,$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 16 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 17 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 18 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 19 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 20 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 21 Alternativas para o Conjunto de Instruções Queremos executar: c = a + b Existem várias opções para isso... 22 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 • MIPS: Formas de endereçamento MUITO SIMPLES! Isso é uma característica de arquiteturas RISC 23 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? 24 Até agora, para o ISA do MIPS... 25 Algumas reflexões sobre a escolha do conjunto de instruções para uma arquitetura... 26 Sobre os modos de endereçamento 27 Exemplos de modos de endereçamento (1) 28 Exemplos de modos de endereçamento (2) 29 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 30 Distância (em bits) dos deslocamentos 31 Uso dos operandos imediatos 32 Tamanho dos operandos imediatos 33 Tipos/Tamanhos de operandos 34 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. 35 Possibilidades de Operadores no Conj. Inst. 36 Instruções mais usadas 37 Números de Operandos em ISAs 38