aula_4
aula_4
aula_4
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Conjunto de instruções e modos de<br />
endereçamento<br />
<strong>aula</strong> 4<br />
Profa. Débora Matos
Conjunto de Instruções<br />
A = ((B + C) x D + E –F)/(G x H)<br />
A – H – denotam posições da memória –<br />
endereços<br />
As arquiteturas possuem as seguintes<br />
operações aritméticas:<br />
ADD – para soma<br />
SUB – para subtração<br />
MUL – para multiplicação<br />
DIV - para divisão
Arquitetura de 4 endereços<br />
A = ((B + C) x D + E –F)/(G x H)<br />
OP E1 E2 E3 E4<br />
Endereço Instrução Comentário<br />
e1 ADD B C A e2 Soma B com C, salva resultado em A<br />
e2 MUL A D A e3 Multiplica A por D, salva resultado em A<br />
e3 ADD A E A e4 Soma A com E, salva resultado em A<br />
e4 SUB A F A e5 Subtrai F de A, salva resultado em A<br />
e5 DIV A G A e6 Divide A por G, salva resultado em A<br />
e6 DIV A H A e7 Divide A por H, salva resultado em A<br />
e7 HALT Fim do programa
Arquitetura de 4 endereços<br />
Que tipo de instruções não são<br />
necessárias no modelo de<br />
arquitetura com 4 endereços?
Arquitetura de 3 endereços<br />
Surgiu a necessidade de se utilizar um<br />
registrador específico para controlar<br />
o endereço da próxima instrução:
Arquitetura de 3 endereços<br />
Surgiu a necessidade de se utilizar um<br />
registrador específico para controlar<br />
o endereço da próxima instrução:<br />
PC – program counter
Arquitetura de 3 endereços<br />
A = ((B + C) x D + E –F)/(G x H)<br />
OP E1 E2 E3<br />
Endereço Instrução Comentário<br />
e1 ADD B C A Soma B com C, salva resultado em A,<br />
incrementa PC<br />
e2 MUL A D A Multiplica A por D, salva resultado em A,<br />
incrementa PC<br />
e3 ADD A E A Soma A com E, salva resultado em A,<br />
incrementa PC<br />
e4 SUB A F A Subtrai F de A, salva resultado em A,<br />
incrementa PC<br />
e5 DIV A G A Divide A por G, salva resultado em A,<br />
incrementa PC<br />
e6 DIV A H A Divide A por H, salva resultado em A,<br />
incrementa PC<br />
e7 HALT Fim do programa
Arquitetura de 3 endereços<br />
Quais as vantagens e desvantagens da arquitetura de 3<br />
endereços para a arquitetura de 4 endereços?<br />
Vantagens:<br />
Redução do tamanho da instrução -> redução do tamanho da<br />
memória;<br />
Desvantagens:<br />
Necessidade de instruções explicitas de desvio (como JUMP e<br />
BRANCH);<br />
Não permite mais executar simultaneamente uma<br />
instrução de manipulação de dados e uma instrução<br />
de desvio do fluxo de programa.
Arquitetura de 3 endereços<br />
Quais as vantagens e desvantagens da arquitetura de 3<br />
endereços para a arquitetura de 4 endereços?<br />
Vantagens:<br />
Redução do tamanho da instrução -> redução do tamanho da<br />
memória;<br />
Desvantagens:<br />
Necessidade de instruções explícitas de desvio (como JUMP e<br />
BRANCH);<br />
Não permite mais executar simultaneamente uma instrução<br />
de manipulação de dados e uma instrução de desvio do fluxo<br />
de programa.
Arquitetura de 2 endereços<br />
A economia de memória e a obrigatoriedade de<br />
desenvolvimento de programas sequencias compensam o<br />
grau de liberdade as instruções com 4 endereços;<br />
No entanto, instruções de 3 endereços ainda consomem<br />
muita memória;<br />
Observando-se os programas de 3 instruções, muitas das<br />
vezes, um dos operandos fonte é o mesmo operando<br />
destino. Simplificando-se essa arquitetura, tem-se<br />
arquiteturas de 2 endereços.
Arquitetura de 2 endereços<br />
OP E1 E2<br />
E1 e E2 – indicam a localização dos dois operandos fontes;<br />
E1 – indica também a localização do operando destino;<br />
Não são mais possíveis instruções com 3 operandos<br />
distintos.<br />
O que muda agora?
Arquitetura de 2 endereços<br />
OP E1 E2<br />
Maior redução das instruções;<br />
Pode requerer 2 instruções para apenas 1<br />
instrução da arquitetura com 3 endereços;<br />
Introduz Introduz uma restrição: o resultado é armazenado<br />
em um dos operandos fonte, perdendo o dado<br />
anterior deste operando;<br />
Que grupos de instruções foram necessárias<br />
agora?
Arquitetura de 2 endereços<br />
A = ((B + C) x D + E –F)/(G x H)<br />
OP E1 E2<br />
Endereço Instrução Comentário<br />
e1 MOV A B Move B para A<br />
e2 ADD A C Soma A com C, resultado em A<br />
e3 MUL A D Multiplica A por D, resultado em A<br />
e4 ADD A E Soma A com E, resultado em A<br />
e5 SUB A F Subtrai F de A, resultado em A<br />
e6 DIV A G Divide A por G, resultado em A<br />
e7 DIV A H Divide A por H, resultado em A<br />
e8 HALT Fim do programa
Arquitetura de 1 endereço<br />
Com a criação de registradores especiais, pode-se<br />
reduzir ainda mais o número de endereços,<br />
criando-se as arquiteturas de 1 endereço;<br />
OP E1<br />
E1 indica a localização de um operando de<br />
memória, normalmente 1 dos operandos fontes<br />
da operação;<br />
O outro operando é o acumulador (AC);<br />
O acumulador assume os papéis de um dos<br />
operandos fonte e do operando destino.
Arquitetura de 1 endereço<br />
OP E1<br />
Agora as instruções de movimentação precisam<br />
ser subdivididas de acordo com o sentido da<br />
transferência:<br />
Da memória para o acumulador (LDA – LoaD<br />
acumulator)<br />
Do acumulador para a memória (STA – STore<br />
Acumulator)
Arquitetura de 1 endereço<br />
A = ((B + C) x D + E –F)/(G x H)<br />
OP E1<br />
Endereço Instrução Comentário<br />
e1 LDA B Move B para o acumulador<br />
e2 ADD C Soma Acumulador com C, resultado no acumulador<br />
e3 MUL D Multiplica acumulador por D, resultado no acumulador<br />
e4 ADD E Soma acumulador com E, resultado no acumulador<br />
e5 SUB F Subtrai F do acumulador, resultado no acumulador<br />
e6 DIV G Divide acumulador por G, resultado no acumulador<br />
e7 DIV H Divide acumulador por H, resultado no acumulador<br />
e8 STA A Armazena acumulador no endereço H<br />
e9 HALT Fim do programa
Arquitetura de 1 endereço<br />
A grande vantagem deste tipo de arquitetura está<br />
na economia de acessos a memória, realizando<br />
basicamente operações com o acumulador;<br />
Este é o papel dos registradores locais, as<br />
arquiteturas atuais apresentam vários<br />
registradores de uso geral com essa mesma<br />
finalidade.
Arquitetura de zero endereços<br />
OP<br />
Não existe nenhuma referência explícita à<br />
endereços de memória onde estejam localizados<br />
os operandos;<br />
A A solução nesse caso é usar uma pilha: os<br />
operandos são sempre retirados do topo da pilha.<br />
Duas instruções manipulam a pilha: PUSH E POP<br />
PUSH – insere um dado no topo da pilha<br />
POP – remove o dado no topo da pilha
Arquitetura de zero endereços<br />
A = ((B + C) x D + E –F)/(G x H)<br />
Endereço Instrução Comentário<br />
e1 PUSH H Coloca H no topo da pilha<br />
e2 PUSH G Coloca G no topo da pilha<br />
e3 PUSH F Coloca F no topo da pilha<br />
e4 PUSH E Coloca E no topo da pilha<br />
e5 PUSH D Coloca D no topo da pilha<br />
e6 PUSH C Coloca C no topo da pilha<br />
e7 PUSH B Coloca B no topo da pilha<br />
e8 ADD Topo da pilha recebe B + C (B e C são retirados da pilha)<br />
e9 MUL Topo recebe (B+C) * D<br />
e10 ADD Topo recebe (B+C) * D + E<br />
e11 SUB Topo recebe (B+C) * D + E - F<br />
e12 DIV Topo recebe ((B+C) * D + E – F )/ G<br />
e13 DIV Topo recebe ((B+C) * D + E – F )/ G * H<br />
e14 POP A Topo da pilha é armazenado em A<br />
e15 HALT Fim do programa
Trata-se de um computador hipotético;<br />
Características:<br />
Computador Neander<br />
Largura de dados e endereços de 8 bits;<br />
Dados representados em complemento de 2;<br />
Possui 1 acumulador de 8 bits;<br />
Possui 1 apontador de programas de 8 bits (PC);<br />
1 registrador de estados com 2 códigos de condição:<br />
negativo (N) e zero (Z);
Modos de endereçamento do Neander<br />
O Neander só possui um modo de<br />
endereçamento, o modo direto;<br />
O endereço passado na instrução corresponde o<br />
endereço de memória do operando;<br />
Nas instruções de desvio, o endereço contido na<br />
instrução corresponde à posição de memória onde<br />
está a instrução a ser executada.
N (negativo):<br />
1 – resultado é negativo<br />
0 – resultado é positivo (zero é considerado positivo)<br />
Z (zero)<br />
Códigos de condição<br />
1 – resultado é igual a 0;<br />
0 – resultado é diferente de 0;<br />
As instruções que alteram os códigos de condição<br />
são as instruções lógicas e aritméticas: ADD, NOT,<br />
AND, OR e a instrução LDA.
Conjunto de instruções do Neander<br />
Código Instrução Comentário<br />
0000 NOP Nenhuma operação<br />
0001 STA end Armazena acumulador – (store)<br />
0010 LDA end Carrega acumulador – (load)<br />
0011 ADD end Soma<br />
0100 OR end “ou” lógico<br />
0101 AND end “e” lógico<br />
0110 NOT Inverte (complementa) acumulador<br />
1000 JMP end Desvio incondicional (jump)<br />
1001 JN end Desvio condicional (jump on negative)<br />
1010 JZ end Desvio condicional (jump on zero)<br />
1111 HLT Término da execução (halt)
Modos de endereçamento do Neander<br />
end – endereço direto<br />
Nas instruções STA, LDA, ADD, OR e AND, end<br />
corresponde ao endereço do operando.<br />
Nas Nas instruções JMP, JN e JZ, end corresponde ao<br />
endereço de desvio.
Conjunto de instruções do Neander<br />
Instrução Comentário<br />
NOP Nenhuma operação<br />
STA end MEM(end)
Formato das instruções<br />
As instruções são formadas por um ou dois bytes,<br />
ou seja, ocupam 1 ou 2 posições da memória;<br />
7 4 3 0<br />
Código da instruçãoo Não usado<br />
Endereço direto<br />
No Neander as instruções de 2 bytes são aquelas<br />
que fazem referência à memória.
Exercícios sobre o Neander<br />
Para todos os programas considere:<br />
Início do programa – posição 0 (0H)<br />
Início dos dados – posição 128 (80H)<br />
1) Faça um para subtrais duas variáveis de 8 bits<br />
representadas em complemento de 2.<br />
posição 128: minuendo<br />
posição 129: subtraendo<br />
Posição 130: resultado
Exercícios sobre o Neander<br />
2) Determine qual o maior de 3 variáveis positivas<br />
de 8 bits representadas em complemento de 2 e<br />
armazenadas em posições consecutivas de<br />
memória. O resultado (a maior variável) deve<br />
aparecer na posição de memória consecutiva às<br />
ocupadas pelas variáveis na área reservada aos<br />
dados.
Exercícios sobre o Neander<br />
3) Faça um programa que determine a ocorrência de<br />
overflow na soma de duas variáveis. As variáveis<br />
são de 8 bits em complemento de dois e estão<br />
armazenadas em posições consecutivas de<br />
memória (128 e 129). O resultado da soma<br />
também em 8 bits deve aparecer na primeira<br />
posição livre (130) e o overflow deve ser indicado<br />
da seguinte forma:<br />
Posição 131: conteúdo = 0H – não ocorreu overflow<br />
conteúdo = FFH – ocorreu overflow
Modos de<br />
endereçamento
Modos de endereçamento<br />
Imediato<br />
Direto<br />
Indireto<br />
Registrador<br />
Registrador Indireto<br />
Deslocamento (Indexado)<br />
Pilha
Endereçamento Imediato<br />
O operando vem como parte da instrução<br />
Ex. ADD 5<br />
Adiciona 5 ao conteúdo do acumulador<br />
5 é um operando que vem no campo de endereço<br />
da instrução<br />
Nenhum acesso a memória é necessário<br />
Rápido<br />
Intervalo de definição dos operandos é limitado
Endereçamento Imediato
Endereçamento Direto<br />
O campo de endereço contém o endereço do<br />
operando<br />
Ex. ADD A<br />
Procura na posição A da memória pelo operando;<br />
Adiciona o conteúdo da posição A na memória ao<br />
acumulador;<br />
Um único acesso a memória na busca do operando;<br />
Não há necessidade de cálculos adicionais para<br />
encontrar o endereço efetivo;<br />
Espaço de endereçamento limitado pelo campo.
Endereçamento Direto
Endereçamento Indireto<br />
O Campo de endereço aponta para uma posição<br />
de memória que contém o endereço do operando;<br />
Endereço Efetivo EE = Conteúdo da posição (A)<br />
Ex. ADD (A)<br />
Busca em A, encontra o endereço do operando (A)<br />
e busca em (A) pelo operando<br />
Adiciona o conteúdo do endereço efetivo ao<br />
acumulado
Endereçamento Indireto
Endereçamento por registrador<br />
Operando se encontra em um registrador<br />
indicado no campo de endereço da instrução<br />
EE = R<br />
Número de registradores limitado<br />
O campo de endereço não necessita ser grande<br />
Pequenas instruções<br />
Busca da instrução mais rápida
Endereçamento por registrador<br />
Não há acesso a memória<br />
Execução muito rápida<br />
Espaço de endereçamento muito limitado<br />
Mais registradores contribui com o<br />
desempenho<br />
Requer bons compiladores ou boa programação<br />
assembly
Endereçamento por registrador
Endereçamento por registrador indireto<br />
Endereçamento Indireto<br />
EE = (R)<br />
O operando está na posição de memória apontada<br />
pelo do registrador indicado no campo de<br />
endereçamento;<br />
Espaço de endereçamento (2 n )<br />
Um acesso a memória
Endereçamento por registrador indireto
Endereçamento por deslocamento<br />
O operando se encontra na memória em uma<br />
posição deslocada com relação ao endereço<br />
fornecido no campo de endereço<br />
EE = A + (R)<br />
O campo de endereço pode ter dois valores<br />
A = Guarda o endereço de base<br />
R = Guarda o conteúdo do deslocamento<br />
ou o contrário<br />
O registrador pode ser um registrador default<br />
(economia de bits na instrução)
Endereçamento por deslocamento
Endereçamento por deslocamento
Endereçamento por deslocamento<br />
Os três usos mais comuns do endereçamento por<br />
deslocamento são:<br />
Endereçamento relativo (PC)<br />
Endereçamento registrador-base<br />
Endereçamento indexado
Endereçamento relativo<br />
Uma versão do endereçamento indexado<br />
R = Contador de programa, PC<br />
EE = A + (PC)<br />
O operando se encontra deslocado do valor<br />
indicado no campo de endereço da instrução, com<br />
relação ao endereço apontado por PC
Endereçamento registrador-base<br />
Idêntico ao endereçamento por deslocamento<br />
A contém o deslocamento<br />
R contem o endereço de base<br />
R pode ser implícito ou explícito<br />
Ex. registradores de segmento no 80x86
Endereçamento indexado<br />
A = Base<br />
R = Deslocamento<br />
EE = A + R<br />
Uso em acesso a arrays<br />
EE = A + R<br />
R++
Indexação indireta<br />
Pós-indexação: indexação feita depois do<br />
endereçamento indireto<br />
EE = (A) + (R)<br />
Pré-indexação: indexação feita antes do<br />
endereçamento indireto<br />
EE = (A+(R)
Endereçamento de pilha<br />
O operando é o topo da pilha<br />
Ex.<br />
ADD - desempilha e adiciona os dois itens do topo<br />
da pilha.