Organização de Computadores Aula 25 Conjunto de Instruções: Características e Funções Rodrigo Hausen 10 de novembro de 2011 http://cuco.pro.br/ach2034 Rodrigo Hausen - OCD 1/92 Apresentação 1. Bases Teóricas ● 2. Organização de computadores – ... – 2.4. Sistema de Memórias – 2.5. Subsistema de Entrada/Saída (I/O) – 2.6. Conjunto de Instruções ● ● Aula de hoje: Stallings (5a. Edição), Capítulo 9 Rodrigo Hausen - OCD 2/92 Conjunto de Instruções ● “Fronteira” entre o projetista e o programador de uma máquina: – Projetista: fornece os requisitos funcionais de uma CPU quantos e quais registradores? quais operações na ULA? qual organização da Unidade de Controle? Programador: fornece o modo mais básico de interagir com o hardware do computador ● Nesse nível de programação, é necessário conhecer alguns detalhes internos da máquina: conjunto de registradores, estrutura da memória, tipos de dados disponíveis diretamente na máquina, funcionamento da ULA, etc. ● – Rodrigo Hausen - OCD 3/92 Que é Conjunto de Instruções? ● ● Operação de uma CPU é determinada pelas instruções (comandos) que ela executa, denominadas instruções de máquina ou instruções do computador. Coleção dessas diferentes instruções é chamada conjunto de instruções. Rodrigo Hausen - OCD 4/92 Anatomia de uma Instrução 1) Código de operação (opcode): – faça isto 2) Referência a operando fonte: – com este dado 3) Referência a operando de destino: – coloque o resultado aqui 4) Referência à próxima instrução – quando tiver terminado, vá para esta instrução... – na maioria dos casos, a próxima instrução é a que está no endereço de memória seguinte (neste caso, não há uma referência explícita à próxima instrução) – quando necessário, será fornecido o endereço de memória Rodrigo Hausen - OCD 5/92 Localizações de Operandos ● Operandos fonte e destino podem estar: – na memória referência fornecida por meio de um endereço em um registrador da CPU ● se (geralmente) há vários registradores, instrução deve conter um número que identifique o registrador em um dispositivo de I/O ● se for usada I/O mapeada em memória, a identificação desse operando será feita por meio de um endereço de memória ● – – Rodrigo Hausen - OCD 6/92 Representação das Instruções ● Em código de máquina, cada instrução é representada por um padrão de bits único. – P. ex. no computador IAS, cada instrução era representada por uma palavra de 20 bits 19 opcode 12 11 referência a operando 0 Opcode: Significado: 000000001 Transfere o conteúdo de um endereço de memória para o acumulador 001000001 Transfere o conteúdo do acumulador para um endereço de memória etc. Rodrigo Hausen - OCD 7/92 Representação das Instruções Para uso por humanos, é adotada uma representação mais palatável: cada opcode é representado por um mnemônico, uma abreviação que representa o significado da operação. – Mnemônicos usados para programar o computador IAS Opcode: Mnem. Significado: 000000001 LOAD Transf. o conteúdo de um endereço de memória para o acumulador 001000001 STOR Transf. o conteúdo do acumulador para um endereço de memória – Operandos podem ser representados desta maneira: 000000001000110100001 = LOAD M[3A1] ● Rodrigo Hausen - OCD 8/92 Programando a Máquina ● ● Considere uma instrução em uma linguagem de alto nível, por exemplo, C: X=X+Y Como fazer com instruções de máquina? Rodrigo Hausen - OCD 9/92 Programando a Máquina ● ● ● Considere uma instrução em uma linguagem de alto nível, por exemplo, C: X=X+Y Como fazer com instruções de máquina? Suponha que o conteúdo das variáveis X e Y estão, armazenados, respectivamente, nos ends. 513 e 514. Rodrigo Hausen - OCD 10/92 Programando a Máquina ● ● ● Considere uma instrução em uma linguagem de alto nível, por exemplo, C: X=X+Y Como fazer com instruções de máquina? Suponha que o conteúdo das variáveis X e Y estão armazenados nos ends. (513)16 e (514)16 respectivamente Primeiro, transforme em operações básicas da máquina 1. Carregue o conteúdo do end. 513 em um registrador 2. Adicione o conteúdo do end. 514 ao registrador 3. Armazene o conteúdo do registrador no end. 513 ● Depois, traduza para mnemônicos da máquina ● Por último, transforme em linguagem de máquina ● Rodrigo Hausen - OCD 11/92 Programando a Máquina ● Primeiro, transforme em operações básicas da máquina 1. Carregue o conteúdo do end. (513)16 em um registrador 2. Adicione o conteúdo do end. (514)16 ao registrador 3. Armazene o conteúdo do registrador no end. (513)16 Rodrigo Hausen - OCD 12/92 Programando a Máquina ● ● Primeiro, transforme em operações básicas da máquina 1. Carregue o conteúdo do end. (513)16 em um registrador 2. Adicione o conteúdo do end. (514)16 ao registrador 3. Armazene o conteúdo do registrador no end. (513)16 Depois, traduza para mnemônicos da máquina LOAD M[513] ADD M[514] STOR M[513] Rodrigo Hausen - OCD 13/92 Programando a Máquina ● Primeiro, transforme em operações básicas da máquina 1. Carregue o conteúdo do end. (513)16 em um registrador 2. Adicione o conteúdo do end. (514)16 ao registrador 3. Armazene o conteúdo do registrador no end. (513)16 Depois, traduza para mnemônicos da máquina LOAD M[513] ADD M[514] STOR M[513] ● Por último, transforme em linguagem de máquina 00000001010100010011 00000101010100010100 00100001010100010011 5 1 3 em hexadecimal Rodrigo Hausen - OCD ● 14/92 Tipos de Instruções ● ● Quais tarefas são necessárias para processar dados? Precisamos implementar instruções para elas. Tipos de instruções: – Processamento de dados: instr. aritméticas e lógicas – Armazenamento de dados: instruções de memória – Movimentação de dados: instruções de entrada/saída – Controle de fluxo: instruções de teste e desvio Rodrigo Hausen - OCD 15/92 Número de Endereços ● ● No máximo, precisaríamos de 4 endereços para cada instrução: – 2 operandos, 1 resultado, endereço da instrução seguinte – precisa de palavras muito longas – não é muito comum Na prática, há instruções com 1, 2 ou 3 endereços. Endereço da próxima instrução geralmente é dado pelo PC (implícito na instrução). Rodrigo Hausen - OCD 16/92 Três Endereços ● ● ● ● SUB X, Y, Z Subtrai Z de Y e coloca o resultado em X, denotado como X ← Y − Z Operando de destino, operando fonte 1, operando fonte 2 Não é comum, por precisar de palavras muito longas para representar as instruções Usado nos conjuntos de instrução MIPS32 e MIPS64 para as instruções de soma e subtração (neste caso, operandos são apenas registradores) Rodrigo Hausen - OCD 17/92 Dois Endereços SUB X, Y Subtrai Y de X e coloca o resultado em X, denotado como X ← X − Y ● Uma referência serve como operando fonte e como destino. ● Reduz tamanho da instrução ● Requer trabalho maior dentro do processador: – armazenamento temporário de alguns resultados ● Quase todas as arquiteturas possuem instruções com 2 endereços. ● Usado no conjunto de instruções IA-32 (Intel 32 bits) para as operações aritméticas ● Rodrigo Hausen - OCD 18/92 Um Endereço ● ● ● ● SUB X Subtrai X de quem? Segundo endereço implícito, geralmente um registrador especial chamado acumulador (AC) SUB X, geralmente, subtrai X do acumulador, colocando o resultado no acumulador: AC ← AC − X Comum nas primeiras máquinas (IAS) Rodrigo Hausen - OCD 19/92 Comparação entre 3, 2, 1 Endereços ● Programa para calcular Y = (A − B) / (C + D × E) Rodrigo Hausen - OCD 20/92 Zero Endereço? ● ● ● Todos os operandos são implícitos Usa uma pilha push X // coloca X no topo da pilha push Y // coloca Y no topo da pilha, acima de X sub // subtrai os dois elementos superiores da pilha e // coloca o resultado no topo pop Z // tira do topo da pilha, coloca em Z Usado em máquinas de pilha, como a máquina virtual Java. Rodrigo Hausen - OCD 21/92 Quantos Endereços? ● ● Mais endereços: – Instruções mais complexas (mais poderosas?) – Necessita de mais registradores – Operações entre registradores mais rápidas – Menos instruções por programa, menos buscas de instrução à memória Menos endereços: – Instruções mais complexas (menos poderosas?) – Mais instruções por programa, mais buscas de instrução à memória – Para cada instrução, subciclo de busca e execução mais rápido Rodrigo Hausen - OCD 22/92 Projeto do Conjunto de Instruções Repertório de Operações – Quantas? O que elas podem fazer? Quão complexas? ● Tipos de dados – inteiros? ponto flutuante? string? ● Formato das instruções – Qual tamanho do opcode? Quantos endereços? ● Registradores – Número de registradores disponíveis? Qual o propósito de cada um? ● Endereçamento (cap. 10) – Direto, indireto, operando imediato, etc. ● Afeta diversos aspectos do sistema: complexidade, desempenho, ... ● Rodrigo Hausen - OCD 23/92 Repertório de Operações ● Vale mais a pena projetar um processador com um conjunto rico e diversificado de instruções... OU um processador simples, com instruções simples, onde cada uma delas é executada de maneira bem rápida? ● CISC = Complex Instruction Set Computer versus RISC = Reduced Instruction Set Computer Rodrigo Hausen - OCD 24/92 Tipos de Operandos Endereços ● Números: – inteiro com sinal, inteiro sem sinal, ponto flutuante, etc. ● Caracteres – padrão ASCII, EBCDIC, etc. ● Dados lógicos – Bits ou flags (conjunto de bits de estado) ● O mesmo dado pode ser tratado como de um tipo ou de outro. O “tipo” é determinado pela operação efetuada sobre ele. ● Rodrigo Hausen - OCD 25/92 Tipos de Operações ● ● ● ● ● ● ● Transferência de dados Aritméticas Lógicas Conversão de formatos Entrada/Saída Controle do Sistema Transferência de Controle Rodrigo Hausen - OCD 26/92 Tipos de Operações: Transferência de Dados ● ● ● Necessário especificar: – Fonte – Destino – Quantidade de dados – Modo de endereçamento Fonte e/ou destino podem ser: memória, registrador ou topo da pilha Alguns dos parâmetros acima podem ser implícitos. Ex.: em assembly IA-32 – push eax: empilha o conteúdo do registrador eax (32bits) Rodrigo Hausen - OCD 27/92 Tipos de Operações: Aritméticas Soma, subtração, multiplicação, divisão ● Invariavelmente, há operações para inteiros com sinal (geralmente representados em complemento a dois) ● Muitas vezes, também há operações para ponto flutuante (Nem sempre! Antes do Pentium, os processadores da Intel possuíam versões com e sem operações para ponto flutuante.) ● Outras operações relativamente comuns: – valor absoluto |X|, inverso aditivo −X, incremento X++, decremento X−− ● Escolha das operações e formatos de representação de números afetam o projeto da ULA ● Rodrigo Hausen - OCD 28/92 Tipos de Operações: Lógicas ● AND, OR, NOT, XOR, etc... lógicos ● Igualdade ● Operações bitwise: bitwise AND, OR, NOT, etc. ● Deslocamentos e rotações (próx. slide) Rodrigo Hausen - OCD 29/92 obs.: presume representação em complemento a dois Rodrigo Hausen - OCD 30/92 Tipos de Operações: de Conversão ● Ex.: conversão de binário para BCD (decimal codificado em binário) empacotado, inteiro sem sinal 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 = 1978 para BCD empacotado 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 ● 1 9 7 8 ASCII ↔ EBCDIC, inteiro ↔ ponto flutuante, etc. Rodrigo Hausen - OCD 31/92 Tipos de Operações: de Entrada/Saída ● ● ● Com I/O mapeada em memória não existe a necessidade de instruções específicas de entrada/saída – podem ser realizadas usando-se instruções de transferência de dados Pode haver instruções específicas Podem ser feitas por um controlador específico (DMA, canais de I/O) Rodrigo Hausen - OCD 32/92 Tipos de Operações: para Controle do Sistema ● ● ● Instruções privilegiadas: podem permitir/negar acesso a determinadas áreas de memória, registradores, dispositivos, etc. Só podem ser executadas caso a CPU esteja em um estado específico: kernel mode ou “ring 0” (IA-32) Geralmente, reservadas para uso pelo Sistema Operacional Rodrigo Hausen - OCD 33/92 Tipos de Operações: para Transferência de Controle Desvio incondicional – desvie a execução para o endereço X (PC ← X) ● Desvio condicional – ex.: desvie a execução para o endereço X se o resultado da última operação aritmética foi zero ● Salto – ex.: incremente o valor do registrador e pule a próxima instrução se o valor for diferente de zero ● Chamada a uma subrotina ou procedimento – compare com: chamada a handler de interrupção ● Rodrigo Hausen - OCD 34/92 Desvios: Exemplo BRanch if Zero BRanch if Equal Rodrigo Hausen - OCD 35/92 Chamada a Subrotinas Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ Rodrigo Hausen - OCD Programa principal 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN Primeira subrotina 4800 ___________ ___________ ___________ ___________ RETURN Segunda subrotina 36/92 Chamada a Subrotinas Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ Rodrigo Hausen - OCD Programa principal 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN Primeira subrotina 4800 ___________ ___________ ___________ ___________ RETURN Segunda subrotina 37/92 Chamada a Subrotinas Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ Rodrigo Hausen - OCD Programa principal 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN Primeira subrotina 4800 ___________ ___________ ___________ ___________ RETURN Segunda subrotina 38/92 Chamada a Subrotinas Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ Rodrigo Hausen - OCD Programa principal 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN Primeira subrotina 4800 ___________ ___________ ___________ ___________ RETURN Segunda subrotina 39/92 Chamada a Subrotinas Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ Rodrigo Hausen - OCD Programa principal 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN Primeira subrotina 4800 ___________ ___________ ___________ ___________ RETURN Segunda subrotina 40/92 Chamada a Subrotinas Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ Rodrigo Hausen - OCD Programa principal 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN Primeira subrotina 4800 ___________ ___________ ___________ ___________ RETURN Segunda subrotina 41/92 Chamada a Subrotinas Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ Rodrigo Hausen - OCD Programa principal 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN Primeira subrotina 4800 ___________ ___________ ___________ ___________ RETURN Segunda subrotina 42/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD dados rel. prog. princ. Pilha: conteúdo inicial 43/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD 4101 dados rel. prog. princ. empilha PC+1 (end. de retorno) Pilha: em CALL 4500 44/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD dados rel. proc. 1 4101 dados rel. prog. princ. Pilha: após CALL 4500 antes CALL 4800 45/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD 4601 dados rel. proc. 1 empilha PC+1 (end. de retorno) 4101 dados rel. prog. princ. Pilha: em CALL 4800 46/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD dados rel. proc. 2 4601 dados rel. proc. 1 4101 dados rel. prog. princ. Pilha: após CALL 4800 antes RETURN 47/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD 4601 dados rel. proc. 1 4101 dados rel. prog. princ. ← será novo valor do PC Pilha: em RETURN 48/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD dados rel. proc. 1 4101 dados rel. prog. princ. Pilha: após RETURN antes CALL 4800 49/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD 4651 dados rel. proc. 1 empilha PC+1 (end. de retorno) 4101 dados rel. prog. princ. Pilha: em CALL 4800 50/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD dados rel. proc. 2 4651 dados rel. proc. 1 4101 dados rel. prog. princ. Pilha: após CALL 4800 antes RETURN 51/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD 4651 dados rel. proc. 1 4101 dados rel. prog. princ. ← será novo valor do PC Pilha: em RETURN 52/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD dados rel. proc. 1 4101 dados rel. prog. princ. Pilha: após RETURN antes RETURN (para prog. principal) 53/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD 4101 dados rel. prog. princ. ← será novo valor do PC Pilha: em RETURN (para prog. principal) 54/92 Uso da Pilha Endereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________ 4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN 4800 ___________ ___________ ___________ ___________ RETURN Rodrigo Hausen - OCD dados rel. prog. princ. Pilha: após RETURN (para prog. principal) 55/92 Passagem de Parâmetros ● ● ● A pilha também pode ser usada para passagem de parâmetros Do mesmo modo, também pode ser usada para valores de retorno de funções Ex.: implementar subrotina que faça o equivalente a int soma(int a, int b) { return a+b; } Rodrigo Hausen - OCD 56/92 Passagem de Parâmetros End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN Programa principal Subrotina soma reserva espaço para valor de retorno na pilha coloca parâmetros para subrotina soma na pilha 57/92 Passagem de Parâmetros End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN Programa principal obtem segundo parâmetro obtem primeiro Subrotina parâmetro soma coloca resultado na pilha volta end. de retorno p/ topo da pilha 58/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4000 R1 0000 ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? ???? ???? ???? ???? 59/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4000 R1 0000 ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? ???? ???? ???? ???? ← SP 60/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4000 R1 FFFF ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? ???? ???? ???? 0000 ← SP 61/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4001 R1 FFFF ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? ???? ???? ???? 0000 ← SP 62/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4001 R1 FFFE ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? ???? ???? a 0000 ← SP 63/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4002 R1 FFFE ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? ???? ???? a 0000 ← SP 64/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4002 R1 FFFD ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? ???? b a 0000 ← SP 65/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4003 R1 FFFD ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? ???? b a 0000 ← SP 66/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4003 R1 FFFC ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 67/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4500 R1 FFFC ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 68/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4500 R1 FFFD ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 69/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4501 R1 FFFD ???? R2 ???? Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 70/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4501 R1 FFFD R2 ???? b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 71/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4502 R1 FFFD R2 ???? b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 72/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4502 R1 FFFE R2 ???? b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 73/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4503 R1 FFFE R2 ???? b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 74/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4503 R1 FFFE R2 a b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 75/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4504 R1 FFFE R2 a b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 76/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4504 R1 FFFE R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 77/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4505 R1 FFFE R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 78/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4505 R1 FFFF R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 79/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4506 R1 FFFF R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a 0000 ← SP 80/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4506 R1 FFFF R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a a+b ← SP 81/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4507 R1 FFFF R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a a+b ← SP 82/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4507 R1 FFFE R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a a+b ← SP 83/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4508 R1 FFFE R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a a+b ← SP 84/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4508 R1 FFFD R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a a+b ← SP 85/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4509 R1 FFFD R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a a+b ← SP 86/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4509 R1 FFFC R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a a+b ← SP 87/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 450A R1 FFFC R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? 4004 b a a+b ← SP 88/92 Passagem de Parâmetros incrementa SP MOV R2, [SP] incrementa SP MOV R1, [SP] ADD R1, R2 incrementa SP MOV [SP], R1 decrementa SP decrementa SP decrementa SP RETURN PC SP 4004 R1 FFFD R2 a+b b Pilha (Mem. principal) FFFA FFFB FFFC FFFD FFFE FFFF ... soma: 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 Rodrigo Hausen - OCD 450A Registradores (CPU) ... End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... … ???? ???? ???? b a a+b ← SP 89/92 Em Assembly IA-32 _start: push 0x00000000 ; deixa espaço na pilha (32 bits) push 0xAAAAAAAA ; coloca A na pilha (em 32 bits) push 0xBBBBBBBB ; coloca B na pilha (em 32 bits) call soma add esp, 8 ; “pula” argumentos na pilha pop eax ; coloca resultado no acumulador ... soma: add esp, 4 ; move o apont. pilha 4 bytes p/ baixo mov ebx, [esp] ; coloca 2o param. em ebx add esp, 4 mov eax, [esp] ; coloca 1o param. em eax add eax, ebx add esp, 4 mov [esp], eax ; coloca resultado na pilha sub esp, 12 ; restaura apont. pilha p/ pos correta ret Rodrigo Hausen - OCD 90/92 Em Assembly IA-32 ● A subrotina anterior tem o inconveniente de sobrescrever os conteúdos de 2 registradores. Podemos guardá-los na pilha! soma: push eax ; guarda valor de eax push ebx ; guarda valor de ebx add esp, 12 ; move apont. pilha 12 bytes p/ baixo mov ebx, [esp] ; coloca 2o param. em ebx add esp, 4 mov eax, [esp] ; coloca 1o param. em eax add eax, ebx add esp, 4 mov [esp], eax ; coloca resultado na pilha sub esp, 12 ; restaura apont. pilha p/vals. guardados pop ebx ; restaura valor de ebx pop eax ; restaura valor de eax ret Rodrigo Hausen - OCD 91/92 ● A subrotina anterior tem o inconveniente de sobrescrever o conteúdo de 2 registradores. Podemos guardar o seu conteúdo na pilha! Rodrigo Hausen - OCD 92/92