Ciência da Computação Arq. e Org. de Computadores Nível ISA Prof. Sergio Ribeiro Um Exemplo de Nível ISA: o IJVM Objetivo: Introduzir um nível ISA (Instruction Set Architecture), a ser interpretado pelo microprograma que esteja rodando na microarquitetura da figura apresentada anteriormente. Definição: Macroarquitetura (em contraste com microarquitetura) arquitetura do conjunto de instruções do nível ISA. 2 Pilhas Pilhas Pilhas de Locais Uma área de memória reservada para o armazenamento de variáveis de um procedimento. Registradores utilizados: LV (Local Variable) aponta para o endereço base das variáveis do procedimento corrente. SP (Stack Pointer) aponta para a palavra de mais alta ordem das variáveis do procedimento corrente. Aponta para o topo da pilha. As referências aos elementos da pilha são feitas por deslocamentos a partir do endereço de LV. Uso da pilha para armazenar variáveis. (a) Enquanto A está ativo. (b) Após A ter chamado B. (c) Após B ter chamado C. (d) Após C e B terem retornado e A ter chamado D. 3 4 Pilhas de Operandos Uma área de memória reservada para o armazenamento de operandos durante a avaliação de uma expressão. A figura ilustra o funcionamento da pilha de operandos para o cálculo da expressão: a1=a2+a3 Pool de constantes A arquitetura IJVM divide a memória nos seguintes espaços: Pilha 3 Operandos correntes Quadro 3 correntes Quadro 2 SP LV Área do Procedimento PC 5 CPP Quadro 1 6
1. O Pool de Constantes Não pode ser escrita pelos programas IJVM Contém constantes, strings e ponteiros para endereços de memória O registrador CPP (Constant Pool Pointer) aponta para a primeira palavra do pool de constantes 3. A Pilha de Operandos Fica imediatamente acima do quadro de variáveis O registrador SP armazena o endereço do topo da pilha muda de valor durante a execução do procedimento 2. O Quadro de Locais No início guarda valores dos parâmetros (argumentos) do procedimento chamado O registrador LV contém o endereço da primeira posição do quadro de variáveis 7 4. A Área do Procedimento Região de memória que armazena o programa O registrador PC (Program Counter) aponta para o endereço da instrução que deve ser buscada em seguida. 8 O Conjunto de Instruções É importante lembrar que: CPP, LV e SP apontam para palavras (4 bytes cada palavra). PC aponta para bytes (cada instrução ocupa 1 byte). O incremento de uma unidade no valor do PC, seguido de uma operação de leitura, resulta na busca do próximo byte. O incremento de uma unidade no valor do SP, seguido de uma operação de leitura, resulta na busca da próxima palavra. 9 10 O Conjunto de Instruções Compilação da Linguagem Quando o código for entregue ao compilador JAVA, ele deve produzir um programa na linguagem de montagem. O montador JAVA transforma o programa, em linguagem de montagem, para o programa binário. Operandos byte, const e varnum 1byte. Operandos disp, indice e deslocamento 2 bytes. 11 12
Compilação da Linguagem Compilação da Linguagem i =j + k; 1 ILOAD j // i = j + k Ox15 Ox02 if (i == 3) 2 ILOAD k Ox15 Ox03 k= 0; 3 IADD Ox60 else 4 ISTORE i Ox36 Ox01 j = j -1; 5 ILOAD i // se (i ==3) Ox15 Ox01 6 BIPUSH 3 Ox10 Ox03 7 IF_ICMPEQ L1 Ox9F OxOO OxOD 8 ILOAD j // j = j - 1 Ox15 Ox02 9 BIPUSH 1 Ox10 Ox01 10 ISUB Ox64 11 ISTORE j Ox36 Ox02 12 GOTO L2 OxA7 OxOO OxO7 13 L1: BIPUSH 0 // k = 0 Ox10 OxOO 14 ISTORE k Ox36 Ox03 15 L2: (a) (b) (c) (a) Fragmento de um programa JAVA. (b) O código correspondente na linguagem de montagem Java. (c) O programa em IJVM codificado em hexadecimal. 13 O código compilado pode ser interpretado como: primeiro, j e k são colocados no topo da pilha (1 e 2) depois j e k são somados e guardados na variável i (3 e 4) depois o valor de i e o valor 3 são colocados na pilha esses valores são comparados e, se iguais, a execução é desviada para L1 (7) se valores são diferentes, o valor da variável j e o valor 1 são colocados na pilha (8 e 9) o valor de j é subtraído de 1 e armazenado na variável j (10 e 11) um desvio para um local L2 é executado (12) 14 A Pilha de Operandos do Programa IJVM Exemplo de uma Implementação i=j+k; if(i==3) k=0; else j=j-1; Como deve ser o programa que roda na microarquitetura interpretando as instruções da macroarquitetura? 15 16 Microinstruções e Notação Implementação por meio do Mic-1 Uso de uma linguagem simbólica muito simples que descreve totalmente cada operação, sem entrar em detalhes de como todos os endereços possam vir a ser determinados. Uso de apenas uma linha para especificar todas as operações que ocorrem em um ciclo do clock. Uso de uma espécie de linguagem de montagem para microprogramas Micro Assembly Language MAL. 17 O microprograma contém apenas 112 microinstruções. Microinstruções consecutivas não estão, necessariamente, armazenadas em endereços consecutivos da memória de controle; Registradores: CPP, LV e SP armazenamento de ponteiros para o pool de constantes, para o quadro de variáveis e para o topo da pilha, respectivamente; PC guarda o endereço do próximo byte que contém o código de operação a ser buscado da memória; MBR (1 byte) onde são armazenados em seqüência todos os bytes das instruções a serem executadas; TOS guarda a palavra que está no topo da pilha; OPC pode ser usado para guardar o endereço do código de operação de uma instrução de desvio. 18
Implementação por Implementação por meio do Mic-1 Main1 ;goto (MBR) MBR armazena o código de operação; obtenção do próximo byte; decodificação da instrução nop1 goto Main1 Não faz nada iadd1 iadd2 iadd3 pop1 pop2 pop3 H=TOS MDR=TOS=MDR+H;wr;goto Main1 TOS=MDR;goto Main1 Leitura do valor a ser colocado no topo da pilha H=topo da pilha Soma das duas palavras do topo da pilha; resultado armazenado no topo Leitura do valor a ser colocado no topo da pilha Espera pela leitura do novo valor de TOS Cópia em TOS do novo valor 19 Exemplo Execução da instrução IADD. Vamos supor que o código de operação da instrução (0x60) esteja armazenado no MBR. Operações do loop principal: 1. Incremento do PC, fazendo com que o mesmo aponte para o primeiro byte situado depois do código de operação; 2. Início da busca do próximo byte e armazenamento desse byte no MBR; 3. Desvio para o endereço que estava armazenado no MBR no início do Main1. Esse endereço é igual ao valor numérico do código de operação da instrução que está sendo executada, que foi colocado lá pela microinstrução anterior. 20 Implementação por Implementação por bipush1 bipush2 bipush3 ifeq1 ifeq2 ifeq3 ifeq4 SP=MAR=SP+1 MDR=TOS=MBR;wr;goto Main1 OPC=TOS TOS=MDR Z=OPC;if(Z) goto T;else goto F MBR=byte a ser colocado na pilha Incremento do PC; busca do próximo código de operação Estende o sinal da constante e coloca na pilha Leitura do valor a ser colocado no topo da pilha Armazenamento temporário do valor de TOS em OPC Coloca o novo valor do topo da pilha em TOS Desvio condicional considerando o bit Z 21 T OPC=PC-1;fetch goto goto2 Necessário para tratar o endereço alvo F F2 F3 PC=PC+1 goto Main1 Pula o primeiro byte do deslocamento PC agora aponta para o novo código de operação Espera pela leitura do código de operação 22 Implementação por goto2 goto3 goto4 goto5 goto6 H=MBR<<8 H=MBRU OR H PC=OPC+H;fetch goto Main1 MBR=primeiro byte do deslocamento; busca do segundo byte Deslocamento e armazenamento em H do primeiro byte considerando o sinal H=deslocamento de 16 bits do desvio Soma do deslocamento ao valor em OPC Aguarda a busca do próximo código de operação Um projeto com busca antecipada: o Mic-2 23 24
Um projeto Pipeline: o Mic-3 Um Pipeline de Sete Estágios: o Mic-4 25 26