Organização de Computadores Antônio Borges / Gabriel P. Silva 4. Modelo de Programação do DLX “Quero que o matemático Beremiz Samir nos conte uma lenda, ou uma simples fábula, na qual apareça uma divisão de 3 por 3 indicada, mas não efetuada, e outra de 3 por 2, indicada e efetuada sem deixar resto.” Malba Tahan O Homem que Calculava 4.1. Introdução O modelo de programação que estaremos estudando é baseado no processador didático DLX, definido por Henessy e Patterson no seu livro “Computer Architecture: A Quantitative Approach” (Morgan Kaufmann, 1991). Usaremos um simulador com essa arquitetura para facilitar a compreensão do funcionamento de um processador. O modelo de programação oferece um conjunto de registradores e instruções que são visíveis ao programador ou compilador. Ou seja, podem ser utilizados para a execução de um programa. Eventualmente o processador terá outros registradores que não são visíveis ao programador que foram utilizados para implementar o modelo de programação. O modelo de programação da arquitetura que estaremos utilizando em nosso estudo oferece os seguintes registradores visíveis ao programador: § 32 registradores de uso geral, nomeados de R0 a R31, todos com 32 bits. Esses registradores são referenciados explicitamente pelas instruções que, normalmente, possuem dois registradores como fonte e um registrador como destino das operações. O registrador R0 é um registrador especial que sempre retorna o valor 0. § Um registrador chamado apontador de instruções ou contador de programa (PC), também de 32 bits, que é referenciado implicitamente pelas instruções de desvio, chamada e retorno de procedimento. O PC contém o endereço da próxima instrução a ser buscada na memória para execução. Existe um outro registrador, que não é visível ao programador, chamado de registrador de instrução (IR), que armazena a instrução que foi lida da memória para o processador enquanto está sendo executada. Esse registrador é da mesma largura das instruções do processador, ou seja, 32 bits. Organização de Computadores Antônio Borges / Gabriel P. Silva BANCO DE REGISTRADORES “0” R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 R30 R31 SP FP RA PC Figura 6 – Modelo de Programação Organização de Computadores Antônio Borges / Gabriel P. Silva Durante o seu funcionamento o processador executa permanentemente o seguinte ciclo de operações, denominado de ciclo de execução das instruções: 1. Busca a próxima instrução que está localizada na memória para o registrador de instrução; 2. Atualiza o apontador de instruções (PC) para que ele aponte para a próxima instrução a ser lida da memória e executada. 3. Determina o tipo de instrução e o número de operandos; 4. Busca os operandos, se houver, para os registradores no processador; 5. Executa a instrução; 6. Armazena os resultados; 7. Volta ao passo 1 para executar a próxima instrução. Este ciclo só será interrompido quando o processador receber sinais elétricos especiais para, por exemplo, reiniciar o seu funcionamento, parar totalmente a atividade, entrar em modo de economia de energia ou interromper o seu funcionamento para atender a um pedido da unidade de entrada e saída. A seguir mostramos o diagrama em blocos de uma possível implementação do DLX. A memória principal, por motivos didáticos, foi dividida em memória de instruções e memória de dados. No diagrama, os blocos com o nome MUX servem para selecionar entre duas fontes de dados, de acordo com o comando da unidade de controle. O bloco ADD é um somador binário e o bloco ALU é a unidade aritmética e lógica. Figura 7 – Diagrama em Blocos do DLX Como já dissemos, em nosso modelo todas as instruções possuem 32 bits e nelas estão codificadas a operação que a UAL deve executar e todas as informações adicionais, tais como os registradores fonte e destino das operações aritméticas. Organização de Computadores Antônio Borges / Gabriel P. Silva Existem diversos tipos de instruções que podem ser executadas pelo processador DLX, dentre eles destacamos: § § § § Operações aritméticas (soma, subtração, divisão, multiplicação, etc). Operações lógicas (complemento, deslocamento, etc.). Operações de transferência de dados (entre registradores, do registrador para a memória, da memória para o registrador). Operações de transferência de controle (desvio incondicional e condicional, chamada de procedimento, etc). Nas instruções do DLX podem estar definidos até 3 operandos, sendo dois de leitura e um de escrita. Os operandos de leitura podem ser dois registradores, ou um registrador e um dado imediato, ou seja, uma constante embutida no próprio código da instrução. O operando de escrita ou é um registrador ou uma posição de memória cujo endereço está definido em um registrador, eventualmente este valor é somado a uma constante definida na própria instrução. 4.2. Tipos de Instruções Em uma dada arquitetura existem diversos tipos de instruções em uma linguagem de montagem que podem ser utilizadas pelo compilador para traduzir as sentenças em linguagens de alto nível. As instruções de uma arquitetura genérica podem ser classificadas em: § § § § Instruções Aritméticas e Lógicas (Inteiras) Instruções de Transferência de Dados Instruções de Transferência de Controle Instruções de Ponto Flutuante A seguir classificamos as principais instruções do DLX e mostramos alguns exemplos de suas instruções em linguagem de montagem: a) Instruções Aritméticas e Lógicas (Inteiras) Essas instruções realizam operações aritméticas e lógicas entre dois registradores ou entre um registrador e um operando imediato, guardando o resultado em um outro registrador. nop and sll addi sub srli sge slti R1, R2, R3 R3, R4, R5 R15, R0, #25 R6, R7, R8 R9, R10, #5 R1, R4, R6 R5, R8, #3 ; “no operation” ; R! = R2 and R3 ; R3 = R4 << R5 (desloca R4 de R5 bits p/ esquerda) ; R15 = 25 ; R6 = R7 – R8 ; R9 = R10 >> 5 (desloca R10 de 5 bits p/ direita) ; Se R4 >= R6 então R1 = 1 senão R5 = 0 ; Se R8 < 3 então R5 = 1 senão R5 = 0 ; A instrução de comparação (sCC) pode ser: ; seq ( = ), sne ( != ), slt ( < ), sgt ( > ), ; sle ( <= ), sge ( >= ) b) Transferência de dados Essas instruções realizam operações de transferência do conteúdo de um registrador para a memória e vice-versa. A quantidade de bytes transferidos é definida pelo tipo de instrução, as instruções lb e sb transferem apenas um byte, as instruções lw e sw transferem 4 bytes de cada vez. Organização de Computadores lw lb sw sb Antônio Borges / Gabriel P. Silva R5, (endereço) R9, (endereço) (endereço), R6 (endereço), R8 ; ; ; ; R5 = memória[endereço] (4 bytes) R9 = memória[endereço] (1 byte) memória[endereço] = R6 (4 bytes) memória[endereço] = R8 (byte) O endereço de memória a ser lido ou escrito é obtido pela soma do conteúdo de um registrador com um dado imediato: lw lb sw sb lw R5, 0(R16) R5, 150(R0) 200(R0), R6 8(R16), R8 R8, A(R0) ; R5 = memória [R16+0] ; R9 = memória [150] ; memória[200] = R6 ; memória[R16+8] = R8 ; R8 = memória [A] (A é um rótulo que define ; um endereço de memória.) c) Transferência de controle As instruções desse tipo alteram o valor do apontador de instruções (PC), ou seja, a próxima instrução a ser buscada vai estar no endereço especificado na instrução de desvio e não, com seria esperado, a instrução seguinte. § Desvios Incondicionais Sempre alteram o valor do apontador de instruções. j 1000 § ; PC = 1000 Desvios Condicionais Só alteram o valor do apontador de instruções se a condição especificada for verdadeira. bnez R1, 2000 beqz R8, 3000 § ; se R1 != 0 então PC = 2000, senão PC = PC+4 ; se R8 == 0 então PC = 3000, senão PC = PC+4 Chamada e Retorno de Procedimento A chamada de procedimento é um tipo especial de instrução de desvio incondicional que salva o endereço da instrução seguinte em um registrador antes do desvio ser executado. O retorno de procedimento pega o valor salvo no registrador e atribui ao PC. Veremos esta instrução com mais detalhes na seção 5.2.3. jal 5000 jr § R31 ; R31 = PC + 4 e PC = 5000 (chamada de procedimento) ; PC = R31 (retorno de procedimento) Chamadas ao Sistema São instruções especiais que desviam para rotinas dentro do núcleo do sistema operacional, mudando antes o estado do processador de normal para privilegiado. Esta instrução será estudada com mais detalhes na seção 5.2.5. Organização de Computadores trap #imm trap #0 trap #5 Antônio Borges / Gabriel P. Silva ; desvia para o sistema ; operacional para executar ; o serviço especificado por #imm d) Ponto Flutuante São instruções que manipulam valores reais, normalmente no formato IEEE 754, em precisão simples (32 bits) ou precisão dupla (64 bits). Existe um banco de registradores adicional para armazenar estes tipos de operando. Não estaremos abordando em nosso estudo as instruções de ponto flutuante, muito embora façam parte da definição do DLX.