organização de computadores - cuco.pro.brcuco.pro.br/ach2034/aula25.pdf · pop z // tira do topo...

92
1/92 Rodrigo Hausen - OCD 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

Upload: truongliem

Post on 08-Dec-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

1/92Rodrigo Hausen - OCD

Organização de Computadores

Aula 25Conjunto de Instruções:Características e Funções

Rodrigo Hausen

10 de novembro de 2011

http://cuco.pro.br/ach2034

2/92Rodrigo Hausen - OCD

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

3/92Rodrigo Hausen - OCD

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.

4/92Rodrigo Hausen - OCD

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.

5/92Rodrigo Hausen - OCD

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

6/92Rodrigo Hausen - OCD

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

7/92Rodrigo Hausen - OCD

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

Opcode: Significado:000000001 Transfere o conteúdo de um endereço

de memória para o acumulador001000001 Transfere o conteúdo do acumulador para

um endereço de memóriaetc.

0111219opcode referência a operando

8/92Rodrigo Hausen - OCD

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 IASOpcode: Mnem. Significado:000000001 LOAD Transf. o conteúdo de um endere-

ço de memória para o acumulador001000001 STOR Transf. o conteúdo do acumulador

para um endereço de memória– Operandos podem ser representados desta maneira:

000000001000110100001 = LOAD M[3A1]

9/92Rodrigo Hausen - OCD

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?

10/92Rodrigo Hausen - OCD

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.

11/92Rodrigo Hausen - OCD

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áquina1. Carregue o conteúdo do end. 513 em um registrador2. Adicione o conteúdo do end. 514 ao registrador3. 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

12/92Rodrigo Hausen - OCD

Programando a Máquina● Primeiro, transforme em operações básicas da máquina1. Carregue o conteúdo do end. (513)16 em um registrador2. Adicione o conteúdo do end. (514)16 ao registrador3. Armazene o conteúdo do registrador no end. (513)16

13/92Rodrigo Hausen - OCD

Programando a Máquina● Primeiro, transforme em operações básicas da máquina1. Carregue o conteúdo do end. (513)16 em um registrador2. Adicione o conteúdo do end. (514)16 ao registrador3. Armazene o conteúdo do registrador no end. (513)16

● Depois, traduza para mnemônicos da máquinaLOAD M[513]ADD M[514]STOR M[513]

14/92Rodrigo Hausen - OCD

Programando a Máquina● Primeiro, transforme em operações básicas da máquina1. Carregue o conteúdo do end. (513)16 em um registrador2. Adicione o conteúdo do end. (514)16 ao registrador3. Armazene o conteúdo do registrador no end. (513)16

● Depois, traduza para mnemônicos da máquinaLOAD M[513]ADD M[514]STOR M[513]

● Por último, transforme em linguagem de máquina000000010101000100110000010101010001010000100001010100010011

5 1 3 em hexadecimal

15/92Rodrigo Hausen - OCD

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

16/92Rodrigo Hausen - OCD

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).

17/92Rodrigo Hausen - OCD

Três Endereços

● SUB X, Y, ZSubtrai 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)

18/92Rodrigo Hausen - OCD

Dois Endereços

● SUB X, YSubtrai 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

19/92Rodrigo Hausen - OCD

Um Endereço

● SUB XSubtrai 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)

20/92Rodrigo Hausen - OCD

Comparação entre 3, 2, 1 Endereços

● Programa para calcular Y = (A − B) / (C + D × E)

21/92Rodrigo Hausen - OCD

Zero Endereço?

● Todos os operandos são implícitos

● Usa uma pilhapush X // coloca X no topo da pilhapush Y // coloca Y no topo da pilha, acima de Xsub // 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.

22/92Rodrigo Hausen - OCD

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

23/92Rodrigo Hausen - OCD

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, ...

24/92Rodrigo Hausen - OCD

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 versusRISC = Reduced Instruction Set Computer

25/92Rodrigo Hausen - OCD

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.

26/92Rodrigo Hausen - OCD

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

27/92Rodrigo Hausen - OCD

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)

Tipos de Operações:

28/92Rodrigo Hausen - OCD

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

Tipos de Operações:

29/92Rodrigo Hausen - OCD

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)

Tipos de Operações:

30/92Rodrigo Hausen - OCD

obs.: presumerepresentaçãoem complementoa dois

31/92Rodrigo Hausen - OCD

de Conversão● Ex.: conversão de binário para BCD (decimal codificado

em binário) empacotado, inteiro sem sinal

● ASCII EBCDIC, inteiro ponto flutuante, etc.↔ ↔

Tipos de Operações:

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

32/92Rodrigo Hausen - OCD

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)

Tipos de Operações:

33/92Rodrigo Hausen - OCD

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

Tipos de Operações:

34/92Rodrigo Hausen - OCD

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

Tipos de Operações:

35/92Rodrigo Hausen - OCD

Desvios: Exemplo

BRanch if Zero

BRanch if Equal

36/92Rodrigo Hausen - OCD

Chamada a SubrotinasEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Programaprincipal

Primeirasubrotina

Segundasubrotina

37/92Rodrigo Hausen - OCD

Chamada a SubrotinasEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Programaprincipal

Primeirasubrotina

Segundasubrotina

38/92Rodrigo Hausen - OCD

Chamada a SubrotinasEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Programaprincipal

Primeirasubrotina

Segundasubrotina

39/92Rodrigo Hausen - OCD

Chamada a SubrotinasEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Programaprincipal

Primeirasubrotina

Segundasubrotina

40/92Rodrigo Hausen - OCD

Chamada a SubrotinasEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Programaprincipal

Primeirasubrotina

Segundasubrotina

41/92Rodrigo Hausen - OCD

Chamada a SubrotinasEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Programaprincipal

Primeirasubrotina

Segundasubrotina

42/92Rodrigo Hausen - OCD

Chamada a SubrotinasEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Programaprincipal

Primeirasubrotina

Segundasubrotina

43/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:conteúdoinicial

dados rel.prog. princ.

44/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:em CALL 4500

dados rel.prog. princ.

4101 empilha PC+1(end. de retorno)

45/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:após CALL 4500antes CALL 4800

dados rel.prog. princ.

4101

dados rel.proc. 1

46/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:em CALL 4800

dados rel.prog. princ.

4101

empilha PC+1(end. de retorno)dados rel.

proc. 1

4601

47/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:após CALL 4800antes RETURN

dados rel.prog. princ.

4101

dados rel.proc. 1

4601

dados rel.proc. 2

48/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:em RETURN

dados rel.prog. princ.

4101

dados rel.proc. 1

4601 ← será novo valor do PC

dados rel.proc. 1

dados rel.proc. 1

dados rel.proc. 1

49/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:após RETURNantes CALL 4800

dados rel.prog. princ.

4101

dados rel.proc. 1

dados rel.proc. 1

dados rel.proc. 1

dados rel.proc. 1

50/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:em CALL 4800

dados rel.prog. princ.

4101

dados rel.proc. 1

dados rel.proc. 1

dados rel.proc. 1

empilha PC+1(end. de retorno)

4651

51/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:após CALL 4800antes RETURN

dados rel.prog. princ.

4101

dados rel.proc. 1

dados rel.proc. 1

dados rel.proc. 1

4651

dados rel.proc. 2

52/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:em RETURN

dados rel.prog. princ.

4101

dados rel.proc. 1

dados rel.proc. 1

dados rel.proc. 1

4651 ← será novo valor do PC

53/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:após RETURNantes RETURN(para prog. principal)

dados rel.prog. princ.

4101

dados rel.proc. 1

dados rel.proc. 1

dados rel.proc. 1

54/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:em RETURN(para prog. principal)

dados rel.prog. princ.

4101 ← será novo valor do PC

55/92Rodrigo Hausen - OCD

Uso da PilhaEndereços Memória Principal 4000 ___________ ___________ 4100 CALL 4500 ___________

4500 ___________ ___________ 4600 CALL 4800 ___________ 4650 CALL 4800 ___________ RETURN

4800 ___________ ___________ ___________ ___________ RETURN

Pilha:após RETURN(para prog. principal)

dados rel.prog. princ.

56/92Rodrigo Hausen - OCD

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 aint soma(int a, int b){ return a+b;}

57/92Rodrigo Hausen - OCD

Passagem de Parâmetros End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

Programaprincipal

Subrotinasoma

reserva espaçopara valor de retornona pilha

coloca parâmetrospara subrotina somana pilha

58/92Rodrigo Hausen - OCD

Passagem de Parâmetros End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

Programaprincipal

Subrotinasoma

obtem segundoparâmetro

obtem primeiroparâmetro

coloca resultadona pilha

volta end. de retornop/ topo da pilha

59/92Rodrigo Hausen - OCD

0000

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC ????FFFD ????FFFE ????FFFF ????

4000 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

60/92Rodrigo Hausen - OCD

0000

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC ????FFFD ????FFFE ????FFFF ????

4000 ???? ????

...

...

← SP

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

61/92Rodrigo Hausen - OCD

FFFF

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC ????FFFD ????FFFE ????FFFF 0000

4000 ???? ????

...

...

← SP

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

62/92Rodrigo Hausen - OCD

FFFF

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC ????FFFD ????FFFE ????FFFF 0000

4001 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

63/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC ????FFFD ????FFFE a FFFF 0000

4001 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

64/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC ????FFFD ????FFFE a FFFF 0000

4002 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

65/92Rodrigo Hausen - OCD

FFFD

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC ????FFFD b FFFE a FFFF 0000

4002 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

66/92Rodrigo Hausen - OCD

FFFD

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC ????FFFD b FFFE a FFFF 0000

4003 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

67/92Rodrigo Hausen - OCD

FFFC

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4003 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

68/92Rodrigo Hausen - OCD

FFFC

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4500 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

69/92Rodrigo Hausen - OCD

FFFD

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4500 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

70/92Rodrigo Hausen - OCD

FFFD

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4501 ???? ????

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

71/92Rodrigo Hausen - OCD

FFFD

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4501 ???? b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

72/92Rodrigo Hausen - OCD

FFFD

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4502 ???? b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

73/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4502 ???? b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

74/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4503 ???? b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

75/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4503 a b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

76/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4504 a b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

77/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4504 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

78/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4505 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

79/92Rodrigo Hausen - OCD

FFFF

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4505 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

80/92Rodrigo Hausen - OCD

FFFF

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF 0000

4506 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

81/92Rodrigo Hausen - OCD

FFFF

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF a+b

4506 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

82/92Rodrigo Hausen - OCD

FFFF

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF a+b

4507 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

83/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF a+b

4507 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

84/92Rodrigo Hausen - OCD

FFFE

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF a+b

4508 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

85/92Rodrigo Hausen - OCD

FFFD

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF a+b

4508 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

86/92Rodrigo Hausen - OCD

FFFD

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF a+b

4509 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

87/92Rodrigo Hausen - OCD

FFFC

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF a+b

4509 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

88/92Rodrigo Hausen - OCD

FFFC

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC 4004FFFD b FFFE a FFFF a+b

450A a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

89/92Rodrigo Hausen - OCD

FFFD

Passagem de Parâmetros

PC

Registradores (CPU)

SP R1 R2

Pilha (Mem. principal)

FFFA ????FFFB ????FFFC ????FFFD b FFFE a FFFF a+b

4004 a+b b

...

...

End. Mem. Principal início: 4000 PUSH 0000 4001 PUSH a 4002 PUSH b 4003 CALL 4500 ... …

soma: 4500 incrementa SP 4501 MOV R2, [SP] 4502 incrementa SP 4503 MOV R1, [SP] 4504 ADD R1, R2 4505 incrementa SP 4506 MOV [SP], R1 4507 decrementa SP 4508 decrementa SP 4509 decrementa SP 450A RETURN

← SP

90/92Rodrigo Hausen - OCD

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

91/92Rodrigo Hausen - OCD

Em Assembly IA-32

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

● A subrotina anterior tem o inconveniente de sobrescrever os conteúdos de 2 registradores. Podemos guardá-los na pilha!

92/92Rodrigo Hausen - OCD

● A subrotina anterior tem o inconveniente de sobrescrever o conteúdo de 2 registradores. Podemos guardar o seu conteúdo na pilha!