19.04.2013 Views

aula_4

aula_4

aula_4

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!