Aula Expositiva 4 2.4 Processadores 2.4.1 Micro-instruções 2.4.2 Desvios 2.4.3 Desvios Condicionais 2.4.4 Instruções e Programação em Assembler DCC001 - 2011-2 DCC 001 Programação de Computadores 2o Semestre de 2011 Prof. Osvaldo Carvalho 1 Uma Calculadora DCC001 - 2011-2 2 Uma Calculadora DCC001 - 2011-2 3 Calculadora Fluxos de Dados As rotas de dados da calculadora permitem controlar diversos fluxos de dados, envolvendo a memória RAM, as entradas e saídas, o acumulador e os registradores de dados e de endereços O controle de fluxos é feito pelo usuário Logisim, que se encarrega de mudar de 0 para 1 ou de 1 para 0 os sinais de controle de posse de barramentos e de cópia de registradores, entrar com valores de operandos (endereços, valores a serem somados ou armazenados, …) no registrador In na sequência adequada ao efeito desejado DCC001 - 2011-2 4 Um Fluxo na Calculadora Somar os conteúdos das posições 1 e 2 da memória, e colocar o resultado na posição 3 Etapas: 1. 2. 3. DCC001 - 2011-2 Carregar no acumulador o conteúdo da posição 1 da RAM Somar ao acumulador o conteúdo da posição 2 da RAM Armazenar o conteúdo do acumulador na posição 3 da RAM 5 Etapa 1: Carregar Sinal ACC_Clear = 1 ACC_Clear = 0 Input = 1 In_Clk = 1 In_Clk = 0 In_Bus = 1 MAR_Clk = 1 MAR_Clk = 0 In_Bus = 0 RAM_Bus = 1 ACC_Clk = 1 ACC_Clk = 0 RAM_Bus = 0 DCC001 - 2011-2 Comentários Entrada de operando Carrega no acumulador o conteúdo da posição 1 da RAM 6 Etapa 2: Somar Input = 2 In_Clk = 1 In Clk = 0 In_Bus = 1 MAR_Clk = 1 MAR_Clk = 0 In_Bus = 0 RAM_Bus = 1 ACC_Clk = 1 ACC_Clk = 0 RAM_Bus = 0 DCC001 - 2011-2 Entrada de operando Soma ao acumulador o conteúdo da posição 2 da RAM 7 Etapa 3: Armazenar Input = 3 In_Clk = 1 In_Clk = 0 In_Bus = 1 MAR_Clk = 1 MAR_Clk = 0 In_Bus = 0 ACC_Bus = 1 RAM_Clk = 1 RAM_Clk = 0 ACC_Bus = 0 DCC001 - 2011-2 Armazena o conteúdo do acumulador na posição 3 da RAM 8 Programa Armazenado DCC001 - 2011-2 9 Processador Processador: circuito de comportamento flexível, comandado por um programa O programa é escrito por um ser humano, que deseja resolver um problema de transformação de informação A troca de programa não deve envolver modificações no circuito DCC001 - 2011-2 10 Da Calculadora ao Processador O programa em seu formato final deve ser também informação codificada em bits Para ser executado, o programa deve estar carregado em alguma memória Uma unidade de controle deve ser adicionada à calculadora Os sinais de controle (tomadas de barramentos, clocks de registradores, ...) devem ser emitidos pela unidade de controle de forma a obter a computação determinada pelo programa DCC001 - 2011-2 11 Programa como Codificação dos Sinais de Controle - 1 O programa fica armazenado como uma sequência de palavras em uma memória Por razões que veremos mais tarde, chamamos cada palavra destes programas de micro-instrução A cada bit da micro-instrução corresponde um sinal DCC001 - 2011-2 12 Programa como Codificação dos Sinais de Controle - 2 A unidade de controle implementa um ciclo de leitura em seqüência de microinstruções da memória de programa Os bits de cada palavra lida são encaminhados para as saídas da unidade de controle, que estão ligadas aos pontos de controle da (ex-) calculadora DCC001 - 2011-2 13 Codificação dos Sinais de Controle em Microinstruções In->Dbus In_Clk MAR_Clk RAM_Bus RAM_Clk DR->Bus DR_Clk Subtract Out_Clk Compare_Clk ACC->Bus ACC_Clk ACC_Clear Sinais 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 Clicks Equivalentes Efeito ACC_Clear = 1 ACC_Clear = 0; MAR_Clk=1; MAR_Clk = 0; RAM_Bus = 1; ACC_Clk = 1; ACC = 0 MAR = Bus Bus = RAM ACC = ACC + Bus Microinstruções DCC001 - 2011-2 14 Contador de Programa Soma 1 Registrador DCC001 - 2011-2 15 Unidade de Controle Somente Sinais Contador de Programa armazena o endereço da próxima micro-instrução a ser executada DCC001 - 2011-2 Memória de Programa 16 Caixa de Música DCC001 - 2011-2 17 Operandos No uso da calculadora a intervenção do operador se dá também na entrada de operandos (p. ex. um endereço de palavra a ser carregada, ou um valor a ser adicionado ao acumulador) Para eliminar esta necessidade de intervenção humana, uma unidade de controle deve permitir que estes operandos já possam ser especificados no programa Os operandos devem ser fornecidos pela unidade de controle à (ex-) calculadora nos momentos adequados DCC001 - 2011-2 18 Codificação de Operandos em Micro-Instruções Sinal Adicional coloca Operando no Barramento Bit 23 indica se a palavra codifica um operando DCC001 - 2011-2 Operando nos 16 bits menos significativos = 2 19 CPU-0 Micro-Instruções DCC001 - 2011-2 20 CPU-0: Nosso primeiro processador DCC001 - 2011-2 21 CPU-0: Nosso primeiro processador Calculadora Controle DCC001 - 2011-2 22 Unidade de Controle da CPU-0 Sinais e Operando fornece tempos para atualizações: t0: PC t1: mIR t2: Sinais ou Oper Micro-instrução corrente DCC001 - 2011-2 Sinais Operando 23 Carga de um Programa São programas chamados “loaders”, que lêm programas de discos ou de outra mídia, e os carregam na memória Sim, mas quem carrega o loader? DCC001 - 2011-2 Em computadores atuais, um loader primitivo fica gravado em uma memória ROM Este loader carrega outro loader mais sofisticado, que carrega outro mais sofisticado ainda, que carrega o sistema operacional Em computadores antigos, loaders eram carregados palavra por palavra, através do painel do computador 24 Painel de um PDP11/70, de 1975 DCC001 - 2011-2 25 Logisim e Memórias No Logisim você pode: Escrever diretamente valores para posições de memória Ler de um arquivo um mapa da memória. Os valores de cada palavra da memória ficam escritos em hexadecimal no arquivo Nós vamos fazer uso destas possibilidades para carregar programas e para colocar valores em memórias DCC001 - 2011-2 26 Arquivo e Memória Logisim DCC001 - 2011-2 27 Passos para a Programação da CPU-0 Em uma tabela com 24 posições, se bit 23 = 0, cada um dos outros bits deve ser igual a 1 se desejarmos ligar o sinal de controle correspondente bit 23 = 1, os 16 bits menos significativos codificam um operando Depois, cada micro-instrução (cada linha da tabela) é codificada em hexadecimal O código em hexadecimal é transferido para um arquivo No site vocês encontrarão uma planilha muito útil para isso DCC001 - 2011-2 28 Mais um Programa Queremos agora somar os conteúdos das posições 1, 2, 3, 4 e 5 da memória, colocando o resultado na posição 6 Basta acrescentar ao programa mais passos de somas ao acumulador DCC001 - 2011-2 29 DCC001 - 2011-2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Problema: o programa cresce quando o número de operações cresce! 1 1 1 Soma de 2 parcelas 1 1 1 Oper->Bus In->Dbus In_Clk MAR_Clk RAM_Bus RAM_Clk DR->Bus DR_Clk Subtract Out_Clk Compare_Clk ACC->Bus ACC_Clk ACC_Clear Operando? Oper->Bus In->Dbus In_Clk MAR_Clk RAM_Bus RAM_Clk DR->Bus DR_Clk Subtract Out_Clk Compare_Clk ACC->Bus ACC_Clk ACC_Clear Operando? Dois “programas” Soma de 5 parcelas Sinais Sinais 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 30 Balanço – CPU-0 Sabíamos que podíamos realizar computações com a calculadora, aplicando manualmente os sinais de controle, e entrando também manualmente com operandos Mostramos que é possível automatizar essas operações, com o uso de uma unidade de controle impulsionada por um clock Problema: DCC001 - 2011-2 O programa cresce de tamanho com o número de operações que realiza Qual seria o tamanho de um programa que some um milhão de parcelas? 31 CPU-1 Micro-Instruções de Desvio DCC001 - 2011-2 32 CPU-1: Loops Para conseguir escrever programas cujo tamanho não cresça com o número de operações que realiza, precisamos alterar o nosso modelo de execução seqüencial de micro-instruções Vamos introduzir uma micro-instrução especial que desvia o fluxo de execução para um endereço designado na memória de programa Usando essa instrução de desvio, vamos construir um programa que repetidamente soma 1 ao acumulador DCC001 - 2011-2 33 Formato de Micro-instruções contemplando Desvios Bit 23: Desvio? Bit 22: Operando? 22 21 Micro-instrução 48 37 26 15de 04 3 Sinais para a posição 1 desvio na memória de programa 2023 19 2218 21 17 16 20 15 19 14 18 13 17 12 16 11 15 10 14 913 812 711 610 59 1 Oper->Dbus In->Dbus In_Clk MAR_Clk RAM_Dbus Oper->Dbus RAM_Clk In->Dbus DR->Dbus In_Clk DR_Clk MAR_Clk Subtract RAM_Dbus Out_Clk RAM_Clk Compare_Clk DR->Dbus ACC->Dbus DR_Clk ACC_Clk Subtract ACC_Clear Out_Clk Operando? Desvio? Operando? Desvio? Sinais 1 1 1 1 1 1 DCC001 - 2011-2 1 2 Compare_Clk ACC->Dbus 23 1 1 1 1 34 Unidade de Controle com micro-instrução de Desvio DCC001 - 2011-2 35 O Contador de Programa Endereço de Desvio DCC001 - 2011-2 Decisão sobre o próximo valor do PC 36 CPU-1: Balanço Conseguimos construir programas que prescrevem a repetição de ações pela (ex-) calculadora Mas como fazer para interromper as repetições? Afinal, um loop precisa parar DCC001 - 2011-2 37 CPU-2 Micro-instruções de Desvio Condicional DCC001 - 2011-2 38 CPU-2: Desvios Condicionais Precisamos de micro-instruções de desvio condicional O resultado de comparações é usado para decidir se um desvio é realizado ou não Vamos desenvolver um programa que, como antes, adiciona 1 ao acumulador repetidamente, mas somente enquanto o valor do acumulador não supera um valor colocado pelo usuário na entrada In DCC001 - 2011-2 39 Codificação de Desvios Condicionais 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Oper->Dbus In->Dbus In_Clk MAR_Clk RAM_Dbus RAM_Clk DR->Dbus DR_Clk Subtract Out_Clk Compare_Clk ACC->Dbus ACC_Clk ACC_Clear Igual Maior Operando? Menor Desvio? Sinais Desviar para o 1 1 endereço 4 se 1 1 Bus > ACC 1 1 1 1 1 1 1 1 1 DCC001 - 2011-2 1 1 1 40 CPU-2: Desvios Condicionais Unidade de Controle DCC001 - 2011-2 Registrador Compare 41 CPU-2: Unidade de Controle com Desvio Condicional DCC001 - 2011-2 Lógica de Decisão: Condições na micro-instrução coincidem com o status do registrador de comparação? 42 CPU-2: Balanço Conseguimos implantar desvios condicionais, que nos permitem prescrever loops A forma de se programar, lidando diretamente com sinais, torna difícil a descrição de algoritmos mais ambiciosos Precisamos melhorar a vida do programador DCC001 - 2011-2 43 A CPU Pipoca Instruções e Assembler DCC001 - 2011-2 44 A CPU Pipoca Características - 1 Programas são formados por instruções A execução de cada instrução é feita pela execução de várias micro-instruções Operandos ficam codificados nas instruções Uma única memória RAM abriga dados e programa DCC001 - 2011-2 45 A CPU Pipoca Características - 2 O conjunto de micro-instruções é fixo, e fica gravado em uma memória ROM O processador executa um ciclo de leitura e execução de instruções A programação pode ser feita em linguagem de montagem (assembler), o que, relativamente à programação por sinais de controle, é um grande avanço DCC001 - 2011-2 46 Novos Registradores O ciclo de instrução exige: PC – Program Counter contém o endereço da instrução a ser executada IR – Instruction Register contém a instrução em execução Sinc Entrada e Sinc Saída para sincronização de entrada e saída DCC001 - 2011-2 47 Pipoca – Formato de Instrução 15 14 13 12 OpCode 11 10 Mode 9 8 7 6 5 4 3 Operand 2 1 0 Cada instrução ocupa 16 bits, sendo 4 bits para o código da instrução 2 bits para o modo de endereçamento, que indica se o operando é o que está codificado na instrução, ou se é o conteúdo da posição de memória cujo endereço está na instrução, ou outras alternativas de indireção 10 bits para o operando, cuja interpretação depende do modo de endereçamento DCC001 - 2011-2 48 DCC001 - 2011-2 OpCode2 Adiciona o operando a ACC, deixando o resultado em ACC OpCode10 Descrição Mnemonic Instrução ADD ADD 0 0000 49 Pipoca – Conjunto de Instruções ADD COMPARE SUB JMP LOAD JMPEQ STORE JMPGT INPUT JMPLT OUTPUT HALT DCC001 - 2011-2 50 Programação em Assembler Nenhum ser humano com saúde mental consegue fazer um programa diretamente em binário O processo de programação consiste em DCC001 - 2011-2 preencher uma tabela usando mnemônicos das instruções, dando nomes a posições de memória, sendo assim mais compreensível para humanos, e depois, cuidadosamente, substituir estes mnemônicos e nomes de posições de memória pelos códigos binários correspondentes – processo que chamamos de montagem do programa 51 FINISH X XEND SUM P DCC001 - 2011-2 0 1 2 3 4 00 01 02 03 04 1 5 05 ADD 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 LOAD STORE LOAD STORE LOAD 6 06 STORE 7 07 LOAD 8 08 ADD 9 09 STORE 10 0A COMPARE 11 0B JMPLT 12 0C JMP 13 0D OUTPUT 14 0E HALT 15 0F 16 10 17 11 18 12 19 13 20 14 21 15 0 0 0 0 1 Operand 1 1 1 1 1 Mode Address16 Instruction Address10 LOOP Size Label Programa SumX: Código Fonte Comentários 0 SUM X P SUM Zera o acumulador Coloca 0 em SUM Carrega o endereço X no acumulador Coloca o endereço X em P Carrega o conteúdo de SUM no acumulador Soma o conteúdo da posição de memória cujo 2 P endereço é P ao acumulador 0 SUM Coloca o resultado na posição SUM 1 P Carrega o conteúdo de P 0 1 Soma 1 0 P Coloca o resultado em P 0 XEND Compara XEND com o acumulador 0 FINISH Se for menor, desvia para FINISH 0 LOOP Senão, volta para LOOP 1 SUM Coloca o resultado na saída Para. 3142 4542 Números a serem somados 3325 1234 8786 0 0 52 FINISH X XEND SUM P DCC001 - 2011-2 0 1 2 3 4 1 5 ADD 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 LOAD STORE LOAD STORE LOAD 0 0 0 0 1 Operand 1 1 1 1 1 Mode Instruction Address10 LOOP Size Label Programa SumX Instruções e Dados Comentários 0 SUM X P SUM Zera o acumulador Coloca 0 em SUM Carrega o endereço X no acumulador Coloca o endereço X em P Carrega o conteúdo de SUM no acumulador Soma o conteúdo da posição de memória cujo 2 P endereço é P ao acumulador 0 SUM Coloca o resultado na posição SUM 1 P Carrega o conteúdo de P 0 1 Soma 1 0 P Coloca o resultado em P 0 XEND Compara XEND com o acumulador 0 FINISH Se for menor, desvia para FINISH 0 LOOP Senão, volta para LOOP 1 SUM Coloca o resultado na saída Para. 3142 4542 Números a serem somados 3325 1234 8786 0 0 Instruções STORE LOAD ADD STORE COMPARE JMPLT JMP OUTPUT HALT Dados 53 FINISH LOOP X XEND SUM P FINISH DCC001 - 2011-2 2 3 4 02 LOAD 03 STORE 04 LOAD 1 5 05 ADD 0 X 0 P 1 SUM Carrega o endereço X no acumulador Coloca o endereço X em P Carrega o conteúdo de SUM no acumulador Soma o conteúdo da posição de memória cujo 2 P endereço é P ao acumulador 0 SUM Coloca o resultado na posição SUM 1 P Carrega o conteúdo de P Comentários 0 1 Soma 1 0 P Coloca o resultado em P 0 0 XEND Zera Compara XEND com o acumulador o acumulador FINISH Coloca Se for menor, desvia para FINISH 0 SUM 0 em SUM 0 X LOOP Carrega Senão, volta para LOOP o endereço X no acumulador 1 P SUM Coloca o endereço resultado X naem saída 0 P Para. 1 SUM Carrega o conteúdo de SUM no acumulador 3142 Soma o conteúdo da posição de memória cujo 2 P 4542 endereço é P ao acumulador Números serem somados 3325 0 SUM Coloca o resultado naa posição SUM 1234 1 P Carrega o conteúdo de P 8786 0 1 Soma 1 0 0 P Coloca o resultado em P 0 0 XEND Compara XEND com o acumulador 0 FINISH Se for menor, desvia para FINISH 0 LOOP Senão, volta para LOOP 1 SUM Coloca o resultado na saída Operand Instruction Address16 Mode Programa SumX: Código Fonte Uso de Mnemônicos 6 06 STORE 7 07 LOAD 8 08 ADD 9 09 STORE 10 COMPARE 0 0A 00 LOAD 11 0B STORE JMPLT 1 01 12 0C LOAD JMP 2 02 13 OUTPUT 3 0D 03 STORE 14 0E LOAD HALT 4 04 15 0F 5 05 ADD 16 10 17 11 STORE 6 06 18 12 LOAD 7 07 19 13 ADD 8 08 20 14 STORE 9 09 21 0A 15 COMPARE 10 11 0B JMPLT 12 0C JMP 13 0D OUTPUT Address10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Size Label LOOP 1 1 1 54 1 5 05 ADD 6 7 8 9 10 11 12 13 06 07 08 09 0A 0B 0C 0D DCC001 - 2011-2 STORE LOAD ADD STORE COMPARE JMPLT JMP OUTPUT Operand 04 LOAD Mode Address10 Instruction Size 4 Label LOOP 1 1 1 1 1 1 1 1 FINISH 1 Address16 Programa SumX Loop e Finalização Comentários 1 SUM Carrega o conteúdo de SUM no acumulador Soma o conteúdo da posição de memória 2 P cujo endereço é P ao acumulador 0 SUM Coloca o resultado na posição SUM 1 P Carrega o conteúdo de P 0 1 Soma 1 0 P Coloca o resultado em P 0 XEND Compara XEND com o acumulador 0 FINISH Se for menor, desvia para FINISH 0 LOOP Senão, volta para LOOP 1 SUM Coloca o resultado na saída 55 Montagem de uma Instrução Instrução Códigos Binário Hexa OpCode Mode Operand LOAD 1 SUM 1000 01 0000010100 1000 0100 0001 0100 8414 Vem da tabela de códigos de instrução DCC001 - 2011-2 SUM é o nome dado à posição x14 da memória 56 Programas Montadores - 1 A tradução da tabela-programa para binário é uma tarefa insana, com fortes exigências de verificação Mas essa tarefa só foi feita manualmente pelos pioneiros da computação Cedo se percebeu que computadores são uma excelente ferramenta para ... programar computadores! DCC001 - 2011-2 57 Programas Montadores Montadores ou assemblers são programas que lêm tabelas-programas, e geram arquivos com imagens binárias a serem carregadas na memória, substituindo os mnemônicos pelos bits adequados. A planilha Pipoca.xls foi utilizada como montador para os programas exemplo DCC001 - 2011-2 58 Resumo – 1 Um processador básico possui memória, registradores, unidade lógico-aritmética, e uma unidade de controle O processamento é feito por deslocamentos de dados entre memória e registradores, e transformações de dados realizadas pela ULA DCC001 - 2011-2 59 Resumo – 2 A unidade de controle segue um programa armazenado em uma memória, DCC001 - 2011-2 emitindo sinais de controle (posse de barramentos, cópias de entradas de registradores) que comandam os deslocamentos de informação no processador, e fornecendo operandos como endereços ou valores numéricos. 60 Resumo – 3 Um programa é escrito – e lido – por humanos executado por um processador Um programa tem formatos apropriados para a escrita por um programador a execução por um processador A transformação de um formato em outro é normalmente feita por … um programa DCC001 - 2011-2 61