EA869 Modos de Endereçamento Faculdade de Engenharia Elétrica e de Computação (FEEC) Universidade Estadual de Campinas (UNICAMP) Prof. Levy Boccato 1 Objetivos Reconhecer em uma instrução Assembly onde estão os dados que devem ser manipulados. Conhecer os diversos modos de endereçamento. Conhecer os modos processador ARM. de endereçamento existentes no 2 Introdução Vimos anteriormente como é possível melhorar o desempenho de um processador a partir de uma técnica de execução paralela de instruções: a pipeline. Vimos também que processadores RISC exploram mais facilmente esta técnica, uma vez que o mapeamento é direto e a execução das instruções leva o mesmo tempo em ciclos de relógio. Tal fato deve-se, principalmente, por processadores RISC acessarem a memória apenas com instruções especiais. As instruções de processamento de dados não permitem escrita e leitura da memória; ou seja, não a endereçam. Já processadores CISC são capazes de acessar a memória a partir de qualquer instrução; isto é, suas instruções podem endereçar a memória. Ao ler ou escrever uma instrução Assembly, precisamos conhecer os modos de endereçamento do processador para sabermos onde está o dado que queremos acessar. MODOS DE ENDEREÇAMENTO 3 Introdução Onde você está? ENDEREÇO Todo dado tem associado a ele um endereço. Só conseguimos acessá-lo se soubermos qual é este endereço. Vamos supor que eu queira entrar em contato com uma pessoa e me passam a seguinte informação: @gmail.com Avenida(19) 1, 9375 5657 Barão Geraldo, Campinas-SP HTTP://WWW.FACEBOOK.COM/ Como encontrá-la? E-MAIL CASA TELEFONE FACEBOOK Toda informação possui um “rótulo” que indica onde o dado está ou, ao menos, como acessá-lo. Estas formas de acesso constituem os chamados modos de endereçamento. 4 Introdução Onde estão os rótulos que indicam os modos de endereçamento? Na própria instrução! • Em Linguagem de Máquina C.O. OP1 MODO Indica qual a forma de endereçamento do operando OP2 ... END-b Endereço-base do operando Conteúdo-base para o cálculo do endereço do dado. Pode ser: - O próprio endereço do dado - O próprio dado - Deslocamento - Registrador, etc 5 Introdução Onde estão os rótulos que indicam os modos de endereçamento? Na própria instrução! • Em Linguagem Simbólica (Assembly) C.O. (OP1) Rótulos indicarão o modo # OP2 + Nossa meta agora será conhecer estes rótulos e identificar onde está o dado que queremos acessar! 6 Endereço Efetivo • Antes de identificarmos os modos de endereçamento em uma instrução, precisamos conhecer onde está o endereço efetivo de um dado. Endereço Efetivo (EE) É o endereço real, ou final, de um dado a ser manipulado Onde está este EE? MODO DIRETO O EE está na própria instrução C.O. MODO END-b MEMÓRIA operando EE MODO INDIRETO O EE está no endereço especificado na instrução C.O. MODO END-b MEMÓRIA EE operando 7 Modos de endereçamento Considere uma linguagem Assembly fictícia na qual o primeiro operando será sempre o registrador destino. Vamos analisar o endereçamento do segundo operando. Exemplo: MOV R2 , # 1 R2 ← ‘1’ Onde está o dado? (EE?) Na própria instrução EE = (PC) ENDEREÇAMENTO IMEDIATO • Neste tipo de endereçamento, o operando, uma constante ou literal, é especificado diretamente no campo de endereço-base da instrução. Assim, o operando faz parte da instrução. • O endereço efetivo é o conteúdo do próprio registrador PC. INSTRUÇÃO C.O. ... IMED. MODO END-b DADO EE = (PC) Modos de endereçamento Exemplo: MOV R2 , 1 Onde está o dado? (EE?) R2 ← (1) EE = posição de memória 1 ENDEREÇAMENTO ABSOLUTO DIRETO • O endereço efetivo é o endereço referenciado no campo de endereço do operando. INSTRUÇÃO C.O. ... AD MODO end END-b EE = end Modos de endereçamento Exemplo: MOV R2 , ( 1 ) Onde está o dado? (EE?) R2 ← ((1)) EE = (posição de memória 1) ENDEREÇAMENTO ABSOLUTO INDIRETO • O endereço efetivo está contido na posição de memória cujo endereço é referenciado no campo do operando. INSTRUÇÃO C.O. ... AID MODO end END-b EE = (end) Modos de endereçamento Exemplo: MOV R2 , R1 Onde está o dado? (EE?) R2 ← (R1) EE = Registrador R1 ENDEREÇAMENTO POR REGISTRADOR DIRETO • O endereço efetivo é o próprio registrador referenciado no campo de endereço da instrução; o registrador contém o próprio operando. INSTRUÇÃO C.O. ... ERD MODO Regis. END-bi EE = Registrador i Modos de endereçamento Exemplo: MOV R2 ,(R1) Onde está o dado? (EE?) R2 ← ((R1)) EE = (Registrador R1) ENDEREÇAMENTO POR REGISTRADOR INDIRETO • O endereço efetivo está contido no registrador referenciado no campo de endereço do operando. INSTRUÇÃO C.O. ... MODO ERID Regis. i END-b EE = (Registrador i) Modos de endereçamento Exemplo: MOV R2 , +8(PC) Onde está o dado? (EE?) R2 ← ((PC) + 8) EE = (PC) + 8 ENDEREÇAMENTO RELATIVO • O endereço efetivo é calculado pela adição do conteúdo do registrador PC com um deslocamento contido no campo de endereço da instrução. INSTRUÇÃO C.O. ... ER MODO desloc END-b EE = (PC) + desloc. Modos de endereçamento Exemplo: MOV (R2)+ , R3 (R2) ← (R3) R2 ← (R2) + 1 Onde está o dado? (EE?) EE = (Registrador R2) ENDEREÇAMENTO AUTO-INCREMENTO • O endereço efetivo é incrementado durante o ciclo de acesso. No auto-incremento, após calculado o endereço efetivo, seu conteúdo é incrementado. INSTRUÇÃO C.O. ... MODO EAI Regist. END-b i EE = (Regist. i) Modos de endereçamento Exemplo: MOV -(R2) , R3 R2 ← (R2) – 1 (R2) ← (R3) Onde está o dado? (EE?) EE = (Registrador R2) - 1 ENDEREÇAMENTO AUTO-DECREMENTO • Antes de se determinar o endereço efetivo, o conteúdo do registrador é decrementado. INSTRUÇÃO C.O. ... MODO EAD Regist. END-b i EE = (Regist. i) - 1 Modos de endereçamento Considere que nosso processador possua um Registrador Indexador (RIX) , cuja função é definir um deslocamento para o endereço-base da instrução. Exemplo: Onde está o dado? (EE?) MOV R2 , RIX(100) R2 ← (100 + (RIX)) EE = 100 + (RIX) ENDEREÇAMENTO INDEXADO DIRETO • No modo indexado direto o conteúdo do registrador RIX é somado ao endereço-base para determinação do endereço efetivo. INSTRUÇÃO C.O. ... EID MODO End END-b EE = desloc + end RIX desloc Modos de endereçamento Considere que nosso processador possua um Registrador Indexador (RIX) , cuja função é definir um deslocamento para o endereço-base da instrução. Exemplo: Onde está o dado? (EE?) MOV R2 ,(RIX(100)) R2 ← ((100 + (RIX))) EE = (100 + (RIX)) ENDEREÇAMENTO INDEXADO INDIRETO • PRÉ-INDEXADO: o deslocamento contido no registrador indexador é somado ao endereço base antes da busca do endereço indireto. INSTRUÇÃO C.O. ... EIIDPRE MODO End END-b EE = (desloc + end) RIX desloc Modos de endereçamento Considere que nosso processador possua um Registrador Indexador (RIX) , cuja função é definir um deslocamento para o endereço-base da instrução. Exemplo: Onde está o dado? (EE?) MOV R2 , RIX((100)) R2 ← ((100) + (RIX)) EE = (100) + (RIX) ENDEREÇAMENTO INDEXADO INDIRETO • PÓS-INDEXADO: o deslocamento contido no registrador indexador é somado ao conteúdo da posição de memória dada pelo endereço-base (indireto). INSTRUÇÃO C.O. ... MODO EIIDPOS End END-b EE = desloc + (end) RIX desloc Modos de endereçamento Agora, além do RIX, nosso processador possui um Registrador de Base (RB), de forma que o endereço-base estará contido nele. Exemplo: Onde está o dado? (EE?) MOV R2 , 8(RB) R2 ← ((RB) + 8) EE = (RB) + 8 ENDEREÇAMENTO BASEADO • O endereço efetivo é calculado com a adição do conteúdo de um Registrador de Base (RB) a um deslocamento contido no campo de endereço da instrução. O deslocamento é interpretado como um número com sinal, permitindo um deslocamento, positivo ou negativo, em relação à posição dada pelo conteúdo do registrador RB. INSTRUÇÃO C.O. ... EB MODO desloc END-b EE = end-b + desloc RB End-b Modos de endereçamento Agora, além do RIX, nosso processador possui um Registrador de Base (RB), de forma que o endereço-base estará contido nele. Exemplo: MOV R2 , RIX(RB) Onde está o dado? (EE?) R2 ← ((RIX) + (RB)) EE = (RIX) + (RB) ENDEREÇAMENTO BASEADO E INDEXADO • O endereço efetivo é calculado com a adição do conteúdo de um Registrador de Base (RB) com o conteúdo do Registrador Indexador (RIX). • Este é o modo de endereçamento mais versátil de todos. Qualquer um dos exemplos de utilização apresentados pode ser implementado com este modo de endereçamento. INSTRUÇÃO C.O. ... MODO EBI RIX END-bRB EE = (RIX) + (RB) Modos de endereçamento Exemplo: NEG Onde está o dado? (EE?) Acc ← (Acc) EE = Acc ENDEREÇAMENTO INERENTE OU IMPLICITO • O próprio código de operação identifica o endereço dos dados a serem manipulados. • O endereço do operando não é especificado na instrução, é implícito. Modos de endereçamento ENDEREÇAMENTO POR PILHA • Neste caso, o apontador de pilha SP indica o endereço efetivo do dado. • Retirando dados da pilha: POP R1 SP ← (SP) – 1 R1 ← ((SP)) EE = (SP) - 1 • Inserindo dados na pilha: PUSH R1 (SP) ← (R1) SP ← (SP) + 1 EE = (SP) Este tipo de endereçamento é muito utilizado para salvar o conteúdo de registradores e posições de memória que posteriormente serão recarregados em suas posições originais. Uso típico: subrotinas. Conclusões • Ao escrever ou ler uma instrução Assembly, precisamos conhecer onde estão os dados que estamos manipulando. • A instrução nos fornece o endereço-base, ou seja, um conteúdo que irá nos auxiliar a descobrir qual é o endereço efetivo do dado. Além disso, ela nos fornece os “rótulos” que determinarão onde estão os dados. • Há diversos modos de combinar o endereço-base com os rótulos a fim de se acessar os dados. Cada forma define um modo de endereçamento. • Processadores CISC possuem muitos modos de endereçamento já que não há restrição no acesso à memória. • Por sua vez, os processadores RISC possuem poucos modos de endereçamento já que o acesso a memória se dá apenas por instruções especiais. Tal fato facilita a programação. • Por fim, um último modo de endereçamento comumente utilizado nos processadores é o endereçamento paginado. Tal forma será detalhadamente estudada na disciplina de EA876, no contexto de sistemas operacionais.