O que esse programa faz?... Linguagem de Montagem Assembly Rudimentar Prof. João Paulo A. Almeida ([email protected]) 2007/01 - INF02597 Com slides de Roberta Lima Gomes e Camilo Calvi 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CONB 1 SAVEB 228 CONB 1 SAVEB 229 LOADA 228 CONB 5 COM JGE 17 LOADA 229 LOADB 228 MUL SAVEC 229 LOADA 228 CONB 1 ADD SAVEC 128 JUMP 4 STOP Reposta Reposta // Assumir i no endereço 228 // Assumir f no endereço 229 0 CONB 1 // i=1; 1 SAVEB 228 2 CONB 1 // f=1; 3 SAVEB 229 4 LOADA 228 // if i >= 5 jump to 17 5 CONB 5 6 COM 7 JGE 17 8 LOADA 229 // f=f*i; 9 LOADB 228 10 MUL 11 SAVEC 229 12 LOADA 228 // i=i+1; 13 CONB 1 14 ADD 15 SAVEC 228 16 JUMP 4 // loop back to if 17 STOP // Assumir i no endereço 228 // Assumir f no endereço 229 0 CONB 1 // i=1; 1 SAVEB 228 2 CONB 1 // f=1; 3 SAVEB 229 4 LOADA 228 // if i >= 5 jump to 17 5 CONB 5 6 COM 7 JGE 17 8 LOADA 229 // f=f*i; 9 LOADB 228 10 MUL 11 SAVEC 229 12 LOADA 228 // i=i+1; 13 CONB 1 14 ADD 15 SAVEC 228 16 JUMP 4 // loop back to if 17 STOP Unidade Central de Processamento - CPU (6) Unidade Central de Processamento - CPU (8) • Formato das Instruções Código da Instrução (OpCode) – – – – Operando - Op (Informação Complementar) OpCode: identifica a instrução a ser efetuada Op: identifica sobre o que (quem) a instrução manipulará Existem instruções de 1, 2 ou 3 operandos O tamanho do OpCode indica o número máximo de instruções da máquina. • n bits => até 2n instruções – Ciclo de Instrução: conjunto de operações realizadas pelo computador para completar a execução de uma instrução CPU Genérica 1 Unidade Central de Processamento - CPU (10) Unidade Central de Processamento - CPU • • Caminho de Dados – Registradores – ULA – Controlado pela UC • • A velocidade do ciclo do caminho de dados (Ciclo de Instrução) determina, em última análise, a velocidade do processador. Unidade Central de Processamento - CPU • (11) Ciclo de Instrução – Conjunto de ações (operações) realizadas pelo computador (leia-se CPU) para completar a execução de uma instrução – Divide-se em Ciclo de Busca (Fetch Cycle) e Ciclo de Execução (Execution Cycle). Ciclo de busca 1. A UC lê (busca) a instrução na memória e carrega (armazena) a instrução em RI para ser decodificada e executada. 2. Atualização do valor de PC (incremento), fazendo-o apontar para a instrução seguinte (12) Ciclo de execução 3. Determinação do tipo de instrução que está armazenada em RI (decodificação) 4. Determinação de onde (endereço) uma palavra está armazenada, caso necessário 5. Busca da palavra, se necessário, e armazenamento em um dos registradores do processador 6. Execução da instrução 7. Retorno ao passo 1 para iniciar a execução da instrução seguinte http://computer.howstuffworks.com/microprocessor2.htm Exemplos de instruções Exemplos de instruções • LOADA mem – Carrega registrador A com conteúdo do endereço de memória mem • LOADB mem - Carrega registrador B com conteúdo do endereço de memória mem • CONB con – Carrega o valor de uma constante con no registrador B • SAVEB mem – Escreve o conteúdo do registrador B no endereço de memória mem • SAVEC mem - Escreve o conteúdo do registrador C no endereço de memória mem • ADD - Soma A e B e escreve o resultado em C • SUB - Subtrai A e B e escreve o resultado em C • MUL - Multiplica A e B e escreve o resultado em C • DIV - Divide A e B e escreve o resultado em C • COM - Compara A e B and store the result in test • JUMP addr – Salta para o endereço • JEQ addr – Salta para o endereço se a comparação anterior tiver resultado em igualdade (A==B) • JNEQ addr - Salta para o endereço se a comparação anterior tiver resultado em desigualdade (A!=B) • JG addr – Salta se A > B, na comparação anterior • JGE addr – Salta se A >= B , na comparação anterior • JL addr – Salta se A < B , na comparação anterior • JLE addr – Salta se A <= B , na comparação anterior • STOP – Para execução 2 Tipos de Operandos Montagem: Mneumônico -> Números • • • • LOADA - 1 LOADB - 2 CONB - 3 SAVEB - 4 SAVEC mem - 5 ADD - 6 SUB - 7 MUL - 8 DIV - 9 COM - 10 JUMP addr - 11 JEQ addr - 12 JNEQ addr - 13 JG addr - 14 JGE addr - 15 JL addr - 16 JLE addr - 17 STOP - 18 Registradores Memória Imediatos Implícitos Primeiro: o que esse programa faz? End. CódigoInstrução/operador 0 3 1 1 2 4 3 128 4 3 5 1 6 4 7 129 8 1 9 128 10 3 11 5 12 10 13 14 i=1; f=1; while (i <= 5) { f = f * i; i = i + 1; } Usando a representação numérica End. CódigoInstrução/operador 0 3 // CONB 1 1 1 2 4 // SAVEB 128 3 128 4 3 // CONB 1 5 1 6 4 // SAVEB 129 7 129 8 1 // LOADA 128 9 128 10 3 // CONB 5 11 5 12 10 // COM 13 14 // JG 17 Usando a representação numérica 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 31 1 129 2 128 8 5 129 1 128 3 1 6 5 128 11 8 18 // LOADA 129 // LOADB 128 // MUL // SAVEC 129 // LOADA 128 // CONB 1 // ADD // SAVEC 128 // JUMP 4 // STOP 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 31 1 129 2 128 8 5 129 1 128 3 1 6 5 128 11 8 18 Usando o conjunto de instruções // Assumir i no endereço 128 // Assumir f no endereço 129 0 CONB 1 1 SAVEB 128 2 CONB 1 3 SAVEB 129 4 LOADA 128 5 CONB 5 6 COM 7 JG 17 8 LOADA 129 9 LOADB 128 10 MUL 11 SAVEC 129 12 LOADA 128 13 CONB 1 14 ADD 15 SAVEC 128 16 JUMP 4 17 STOP 3 Usando o conjunto de instruções comentado Usando rótulos (labels) // Assumir i no endereço 128 // Assumir f no endereço 129 0 CONB 1 // i=1; 1 SAVEB 128 2 CONB 1 // f=1; 3 SAVEB 129 4 LOADA 128 // if i > 5 jump to 17 5 CONB 5 6 COM 7 JG 17 8 LOADA 129 // f=f*i; 9 LOADB 128 10 MUL 11 SAVEC 129 12 LOADA 128 // i=i+1; 13 CONB 1 14 ADD 15 SAVEC 128 16 JUMP 4 // loop back to if 17 STOP // Assumir i no endereço 128 // Assumir f no endereço 129 CONB 1 // i=1; SAVEB 128 CONB 1 // f=1; SAVEB 129 loop_fatorial: LOADA 128 // if i > 5 jump to 17 CONB 5 COM JG final LOADA 129 // f=f*i; LOADB 128 MUL SAVEC 129 LOADA 128 // i=i+1; CONB 1 ADD SAVEC 128 JUMP loop_fatorial // loop back to if final: STOP Usando rótulos para dados Usando rótulos para dados CONB 1 // i=1; SAVEB i CONB 1 // f=1; SAVEB f loop_fatorial: LOADA i // if i > 5 jump to final CONB 5 COM JG final LOADA f // f=f*i; LOADB i MUL SAVEC f LOADA i // i=i+1; CONB 1 ADD SAVEC i JUMP loop_fatorial // loop back to if i>5 final: STOP segment .bss i DB 0 f DB 0 segment .text CONB 1 // i=1; SAVEB i CONB 1 // f=1; SAVEB f loop_fatorial: LOADA i // if i > 5 jump to final CONB 5 COM JG final LOADA f] // f=f*i; LOADB i] MUL SAVEC f LOADA i // i=i+1; CONB 1 ADD SAVEC i JUMP loop_fatorial // loop back to if i>5 final: STOP O que esse programa faz?... Melhorando o nome dos rótulos segment .bss i DB 0 f DB 0 segment .text inicio: CONB 2 SAVEB f loop: LOADA f CONB 10 COM JG else LOADB f SAVEB i JUMP rotulo2 else: LOADA i CONB 1 ADD SAVEC i JUMP fim rotulo2: LOADA i CONB 10 ADD SAVEC i JUMP else fim: STOP segment .bss i DB 0 f DB 0 segment .text inicio: CONB 2 // f=2; SAVEB f loop: LOADA f // if f > 10 jump to soma1 CONB 10 COM JG else LOADB f // i=f SAVEB i JUMP soma10 soma1: LOADA i // i=i+1; CONB 1 ADD SAVEC i JUMP fim soma10: LOADA i // i=i+10 CONB 10 ADD SAVEC i JUMP soma1 fim: STOP 4 Exercício: Calculadora • Operandos nas posições 128 e 129 • Operações na posição 130 de memória: Addição 0 Subtração 1 Multiplicação 2 Divisão 3 • Colocar resposta da operação na posição 131 de memória 5