Aula 25 - Rodrigo Hausen

Propaganda
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
Download