Modos de Endereçamento
Instruções: especificação de modelos de acesso a espaços de memória.
Conceito - Operação
• Maneira como as instruções direcionam o acesso às unidades de memória
• O cálculo dos endereços são realizados simultaneamente a execução da instrução
• Promove o acesso eficiente as estruturas de dados e especificam o endereço completo de memória
• Utilizam menor número de bits no campo de endereço da instrução
• Realiza o cálculo de endereços relativos
▫ Posição da instrução corrente
▫ Posição de base
▫ Independência de um determinado programa em relação à posição de memória onde é carregado pelo SO.
Objetivos
• Tornar eficiente os acessos a: ▫ Estruturas de dados
Matrizes, listas, pilhas.
▫ Constantes
▫ Variáveis
▫ Demais estruturas
Modos de endereçamento
que estudaremos
• Imediato • Direto • Indireto • Registrador • Registrador Indireto • Deslocamento (Indexado) • Pilha • ImediatoImediato
• O operando está dentro da instrução em execução a ele relacionada.
• (fetch) No instante em que a CPU traz a
instrução para ser interpretada na UC, o operando também é alcançado.
Imediato
• Pontos positivos
▫ A execução destes tipos de instruções é mais rápida
▫ Muito usado para iniciar variáveis com valores constantes, onde o valor binário compõe a própria instrução
▫ O acesso a memória é desnecessário
• Limitação
▫ Número insuficiente de bits disponíveis na instrução para representar o valor da constante
Vamos lembrar de alguns
detalhes...
• O que é Operando?
▫ Em código de máquina, operando é um valor, um argumento, no qual a instrução, nomeada por um procedimento mnemônico, atua.
▫ Pode ser um registrador, um endereço de memória, uma constante literal ou um label.
Vamos lembrar de alguns
detalhes...
• Ops! E mnemônico?!
▫ Procedimento de substituição de códigos que
facilita a gravação na memória sem perda de precisão
▫ Método de memorização que consiste em um
conjunto de técnicas que estimulam o aprendizado, através dos mecanismos da memória
• Faltou “Constante Literal”!
Imediato - Ilustração
Exemplo: ADD 8
CódOp Operando
Acumulador
+
Imediato
• Aplicações:
▫ Inicialização de contadores; ▫ Constantes;
▫ Armazenamento de ponteiros em registradores; ▫ Indicação de quantidade de posições em
operações de deslocamento de bits (multiplicação e divisão).
Modos de endereçamento
que estudaremos
• Imediato • Direto • Indireto • Registrador • Registrador Indireto • Deslocamento (Indexado) • Pilha • DiretoDireto
• Ocorre um acesso aleatório e direto a memória ▫ O operando já está contido na memória
▫ Requer somente uma (01) referência à memória para fetch do dado
• O valor do operando indica o endereço do dado já conhecido pelo programador ou pelo compilador
Direto
• É mais usado do que o modo imediato
• Faz uso de valores variáveis
• É mais rápido que o modo indireto
Direto
• Dispensa a implementação de cálculos adicionais na busca do endereço efetivo
• A área de endereçamento é limitada pelo campo
• Endereço Efetivo (EE)
▫ Valor do campo N onde está o operando ou dado. Exemplo a seguir...
Direto - Ilustração
Exemplo: ADD N
CódOp Endereço N Acumulador+
Instrução Memória OperandoDireto
• Aplicação:
Modos de endereçamento
que estudaremos
• Imediato • Direto • Indireto • Registrador • Registrador Indireto • Deslocamento (Indexado) • Pilha • IndiretoIndireto
• O campo operando contém um endereço de memória:
▫ Esse conteúdo é o endereço do dado a ser operado.
• Há um duplo endereçamento
• Permite implementar estruturas de organização de dados mais emaranhadas e sofisticadas
Indireto
• Acaba com a limitação de células endereçáveis
• Necessita de mais acessos à memória principal
▫ O que faz aumentar o tempo dispensado para execução da instrução
• É utilizado para a manutenção de ponteiros de dados
• O endereço intermediário é chamado de ponteiro (“pointer”)
Indireto - Ilustração
Exemplo: ADD (N)
CódOp Endereço N Acumulador+
Instrução Memória Operando Endereço do OperandoIndireto
• Aplicação:
• Imediato • Direto • Indireto • Registrador • Registrador Indireto • Deslocamento (Indexado) • Pilha • Registrador
Modos de endereçamento
que estudaremos
Registrador
• São usados registradores para indicar a posição onde estão os dados.
• Semelhante ao fluxo e funcionamento, quando comparados aos modelos direto e indireto.
• A diferença é que o operando aponta para um registrador:
▫ Onde está o dado - endereçamento direto
▫ Ou referencia para a memória - endereçamento indireto
• O campo ‘operando’ contém um endereço relativo a memória
Registrador
• O operando está em um registrador indicado no campo de endereço da instrução.
• A quantidade de registradores e o espaço de endereçamento são limitados.
• O campo de endereço dispensa tamanho elevado ▫ As instruções são pequenas
▫ fetch a instrução e sua execução são mais rápidas
• Mais registradores contribuem para o desempenho
▫ Isso requer bons compiladores ou uma boa programação assembly
Registrador Direto
O operando aponta para um registrador, onde está localizado o dado.
Registrador Indireto
O operando aponta para um registrador, onde está o endereço de memória (pointer) apontando para o dado.
Registrador - Ilustração
Exemplo: ADD R
CódOp Endereço do Registrador R
Acumulador
+
Instrução
Registradores
Operando
Registrador
• Aplicação:
• Imediato • Direto • Indireto • Registrador • Registrador Indireto • Deslocamento (Indexado) • Pilha • Registrador Indireto
Modos de endereçamento
que estudaremos
Registrador Indireto
• Faz um acesso a memória
• O operando está na posição de memória indicada pelo do registrador apontado no campo de endereçamento
• Quem será o EE?
Registrador - Ilustração
Exemplo: ADD (R)
CódOp Endereço do Registrador R
+
Instrução Registradores Endereço AcumuladorIndireto
Memória OperandoVantagens x Desvantagens
• (+) Bem aplicado na implementação de contadores
• (+) Maior velocidade de execução
▫ O acesso ao registrador é muito mais rápido do que à memória
• (+) Economia de espaço de armazenamento de instrução
▫ O tamanho da instrução é menor
▫ São poucos registradores
▫ Menos bits para endereçamento
• (-) Inadequados para transferir variáveis da MP para ULA
• (-) Pequeno número de registradores
▫ Insuficiência de registradores, no caso de haver muitos dados endereçados por registrador
• Imediato • Direto • Indireto • Registrador • Registrador Indireto • Deslocamento (Indexado) • Pilha • Deslocamento (Indexado)
Modos de endereçamento
que estudaremos
Deslocamento
• O operando está na memória, em uma posição deslocada em relação ao endereço informado no campo ‘endereço’
• O Endereço Efetivo é a junção dos conteúdos do operando e do registrador:
▫ Qualquer uma das variáveis podem guardar o endereço de base ou o conteúdo do deslocamento
Deslocamento - Ilustração
Exemplo: ADD A R
CódOp Registrador R+
Instrução Registradores Endereço Base Acumulador Memória Operando Endereço A+
Deslocamento - Ilustração
Exemplo: ADD A
CódOp+
Instrução Registradores Endereço Base Acumulador Memória Operando Endereço A+
• Imediato • Direto • Indireto • Registrador • Registrador Indireto • Deslocamento (Indexado) • Pilha • Pilha
Modos de endereçamento
que estudaremos
Pilha
• Área da memória principal, endereçada pelo ponteiro de pilha (Stack Pointer)
• O programa deve iniciar o Stack Pointer com o endereço base da pilha
▫ Na maioria das vezes, o mais alto disponível na MP
• A pilha cresce decrementando o ponteiro da pilha
Pilha - Ilustração
Memória Principal Início da Pilha 0 Ponteiro da Pilha Processamento de Sub-RotinasPilha
Exemplo de Processamento de sub-rotina e da pilha
▫ Execução linear do programa
▫ CALL instruction
Chama uma sub-rotina
O endereço da próxima instrução (conteúdo do CI) é
levado (push) para o topo da pilha
Os registradores e flags são salvos na pilha (salva o
contexto do programa)
O conteúdo do CI (ou Program Counter) é substituído
pelo endereço da sub-rotina
A sub-rotina é então executada
Ao final da execução da sub-rotina, é executada a
Pilha
Cotinua...
▫ RETURN instruction
Os registradores e flags são restaurados.
Recompõe-se o contexto do programa call
Retira (pop) o endereço anteriormente colocado no
topo da pilha
Coloca este endereço no CI
Pilha
Importante!
Este processo admite ser repetitivo, em que uma determinada sub-rotina solicita uma segunda sub-rotina, e esta uma terceira, e assim por diante, repetindo sempre este processo.