MM – Microprocessadores e Microcontroladores – Roteiro da Experiência 2 1 EXPERIÊNCIA 2 – MODOS DE ENDEREÇAMENTO Parte I – Fundamentos Teóricos a) Modos de Endereçamento A forma como cada dado a ser manipulado por uma instrução do 8051 é acessado se chama “modo de endereçamento”. Uma mesma instrução pode fazer acesso a mais de um dado, podendo utilizar diferentes modos de endereçamento. Os 5 modos de endereçamento que podem ser utilizados por uma instrução do 8051 são: 1) endereçamento direto áreas de memória que podem ser acessadas: RAM interna, registradores especiais o que é fornecido na instrução: o endereço da RAM interna (de 00h a 7Fh) ou o endereço do registrador especial (de 80h a FFh) exemplos: INC 3 ; incrementa o conteúdo da posição 03h da RAM interna (isto é, o registrador R3 do banco 0) (R3R3+1) INC 0E0h ; incrementa o conteúdo da posição E0h dos registradores especiais (isto é, o registrador especial ACC) (ACCACC+1) 2) endereçamento indireto áreas de memória que podem ser acessadas: RAM interna, RAM externa o que é fornecido na instrução: o registrador-apontador (R0, R1 ou DPTR), isto é, o registrador que contém o endereço da RAM interna (de 00h a 7Fh) ou o endereço da RAM externa (de 0000h a FFFFh), precedido pelo caracter @ (“arroba”) exemplos (supondo que R1=03h, DPH=56h, DPL=78h): INC @R1 ; incrementa o conteúdo da posição 03h da RAM interna (apontada pelo registrador R1), ou seja, é equivalente à instrução INC 3 (R3R3+1) MOVX A, @DPTR ; move o conteúdo da posição 5678h da RAM externa (apontada pelo registrador especial DPTR, formado pelo par DPH e DPL) para o acumulador (ACCmem.ext.[5678h]) 3) endereçamento de registrador áreas de memória que podem ser acessadas: RAM interna (bancos de registradores), registradores especiais o que é fornecido na instrução: o registrador (R0-R7 ou especial) a ser acessado exemplos: INC R3 ; incrementa o conteúdo do registrador R3 do banco de registradores correntemente selecionado, ou seja, se esse banco for o banco 0, é equivalente à instrução INC 3 (R3R3+1) INC A ; incrementa o conteúdo do acumulador, ou seja, é equivalente à instrução INC 0E0h (ACCACC+1) 4) endereçamento imediato áreas de memória acessadas: nenhuma o que é fornecido na instrução: o valor imediato a ser manipulado, precedido pelo caracter # (“sustenido”) exemplos: MOV A, #3 ; move o valor imediato 3 para o acumulador (ACC3) ADD A, #1 ; soma o valor imediato 1 ao conteúdo corrente do acumulador, ou seja, é equivalente à instrução INC A (ACCACC+1) observação: nos exemplos anteriores, além do endereçamento imediato (aos valores 3 e 1), é utilizado também o endereçamento de registrador (ao registrador especial ACC) 5) endereçamento indexado área de memória acessada: memória de programa (apenas para leitura) o que é fornecido na instrução: o par de registradores de índice e de base (ACC e DPTR ou PC, respectivamente), isto é, os registradores cujos conteúdos, somados, resultam no endereço da posição da memória de programa a ser acessada; esses registradores são precedidos pelo caracter @ (“arroba”), e separados pelo caracter “+” (sinal de soma) exemplos: MOVC A, @A+DPTR ; move o conteúdo da posição (ACC+DPTR) da memória de programa para o acumulador (ACCmem.prog.[ACC+DPTR]) MOVC A, @A+PC ; move o conteúdo da posição (ACC+PC) da memória de programa para o acumulador (ACCmem.prog.[ACC+PC]) observação: nos exemplos anteriores, além do endereçamento indexado (as posições da memória de programa), é utilizado também o endereçamento de registrador (ao registrador especial ACC) b) Instruções de movimentação de dados Nesta experiência, serão utilizadas apenas as intruções MOV, MOVX e MOVC, que fazem uma cópia de um valor para uma determinada posição de memória ou para um determinado registrador. Essas instruções possuem 2 operandos, separados pelo caracter “,” (vírgula): o segundo operando (à direita da vírgula), chamado “fonte”, permite obter o valor a ser copiado; o primeiro operando (à esquerda da vírgula), chamado “destino”, permite obter a posição para onde o valor obtido será copiado. Na instrução MOVX (X de eXterna), o fonte ou o destino está na memória RAM externa. Na instrução MOVC (C de Código), o fonte está na memória de programa. Em todos os demais casos, o acesso é à memória RAM interna ou a um registrador especial. Em resumo: MOV destino, fonte faz destino fonte MM – Microprocessadores e Microcontroladores – Roteiro da Experiência 2 2 Parte II – Roteiro Experimental a) Carga do programa Nesta experiência, e nas próximas, você será solicitado a “carregar” um programa, fornecido em código de máquina, na memória RAM externa do kit. Cada programa será apresentado numa tabela, com 6 colunas. A primeira coluna, passo, contém um número seqüencial, associado a cada instrução do programa (que, nas primeiras experiências, deverá ser executado “passo a passo”). A segunda, endereço, contém o endereço inicial de cada instrução, na base hexadecimal (note que, nesta coluna, a base hexadecimal é de “default”, e, portanto, o caracter “h” é omitido). A terceira coluna apresenta uma instrução por linha, em código de máquina, isto é, o programa tal qual ele deve ser carregado na memória RAM externa. Os valores também estão na base hexadecimal, e sem o “h”. Note que uma instrução pode ser composta por 1, 2 ou 3 bytes; portanto, ela pode ocupar 1, 2 ou 3 posições (endereços) da memória. As 3 colunas seguintes apresentam o programa em linguagem de montagem, isto é, numa linguagem compreensível pelo ser humano. A quarta coluna é a do rótulo, isto é, um símbolo não obrigatório que identifica uma instrução, utilizado nas referências a desvios. A quinta coluna é a instrução propriamente dita, composta pelo mnemônico da operação, e por 1 ou mais operandos (registradores, valores numéricos ou rótulos). Aqui, a base de “default” para valores numéricos é a decimal, mas também podem ser utilizadas a base binária (indicada pelo caracter “b”) ou a base hexadecimal (indicada pelo caracter “h”). A sexta coluna, finalmente, é a dos comentários da instrução. Carregue, na memória RAM externa, a partir do endereço 5000h, o programa da Tabela 1, digitando seu código de máquina. passo endereço código de máquina rótulo mnemônico e operandos comentários 1 5000 74 28 MOV A, #28h ACC 28h 2 5002 F9 MOV R1, A R1 ACC 3 5003 74 35 MOV A, #35h ACC 35h 4 5005 40 50 18 MOV DPTR, #5018h DPTR 5018h 5 5008 F7 MOV @R1, A mem.int.[R1] ACC 6 5009 E0 MOVX @DPTR, A mem.ext.[DPTR] ACC 7 500A E5 81 MOV A, 81h ACC mem.int.[81h] 8 500C 93 MOVC A, @A+DPTR ACC mem.prog.[A+DPTR] 9 500D desvia para MONITOR 02 01 C0 LJMP MONITOR Tabela 1 – Programa com instruções que utilizam diferentes modos de endereçamento b) Execução de programas no kit Execute o programa passo a passo, isto é, uma instrução de cada vez, a partir do endereço 5000h (não se esqueça de, antes da execução, carregar o registrador PC com este valor). A execução passo a passo é feita através do comando P-PASSO, descrito na pág.2-9 do “Manual de Experiências” A cada instrução executada, leia o respectivo item, preencha suas lacunas e responda as questões propostas. 1) Após a execução da primeira instrução, o valor do PC foi alterado para ________h, que corresponde ao endereço da próxima instrução a ser executada. Esta primeira instrução carregou o valor ____h no _____________________. O modo de endereçamento do operando #28h é o endereçamento _______________________. 2) Execute a segunda instrução. Nela, o conteúdo do acumulador é copiado no registrador _____, sendo ambos acessados no modo de endereçamento de _____________________. Como os bits RS1 e RS0 do registrador especial PSW estão em 0, o banco de registradores correntemente selecionado é o banco ____. Portanto, o endereço ____h (correspondente ao registrador R1 do banco 0) deve agora ter o valor ____h. Verifique isso! Está OK? (S/N). E o acumulador, teve seu valor alterado? (S/N). Ao final da segunda instrução, o valor do PC é ________h. 3) Execute a terceira instrução, que coloca no acumulador o valor imediato ____h e deixa o PC com o valor ________h. 4) Execute a quarta instrução, que coloca no registrador ______________ o valor ________h (verifique isso! OK? (S/N)) e deixa o PC com o valor ________h. 5) Execute a quinta instrução. MOV @R1, A utiliza o modo de endereçamento indireto, pois ela copia o valor do acumulador na área de RAM interna, numa posição cujo endereço está no registrador ______. No passo 2, esse registrador foi carregado com o valor 28h. Verifique se esse valor está correto (S/N). Examine, agora, a posição 28h da RAM interna. Qual é o valor do seu conteúdo? ____h. Está correto? (S/N) O PC agora tem o valor ________h. 6) Execute a sexta instrução. MOV @DPTR, A também utiliza o modo de endereçamento indireto, agora para copiar o acumulador na RAM ____________ (por isso o X de MOVX!). Como DPTR foi carregado (no passo 4) com o valor ________h, o conteúdo desse endereço na memória externa deve ter, agora, o valor ____h (que estava no acumulador). O PC foi, agora, para ________h. 7) Execute a sétima instrução. O valor copiado no acumulador é obtido por endereçamento _______________, isto é, através do fornecimento de seu endereço. Como seu valor (81h) é maior do que 7Fh, ele aponta um dos registradores especiais, no caso o registrador especial ______, que, no reset, recebe o valor ____h. Verifique se, de fato, esse valor foi copiado no acumulador (S/N). O PC, agora, está em ________h. 8) Execute a oitava instrução. Ela carrega no acumulador um valor obtido na memória de programa, que, em geral, é apenas de leitura (ROM), mas que, no kit, coincide com a RAM externa (um “truque” para podermos carregar um programa qualquer, e, depois, executá-lo). O endereço do valor a ser copiado no acumulador, neste caso, é obtido pela soma dos valores dos registradores ______ e ______, ou seja, ____h e ________h, que resulta em ________h. Essa posição pode ter qualquer conteúdo, pois ainda não foi acessada. No caso, seu conteúdo é ____h. Já o PC foi para ________h. 9) A última instrução não é de movimentação de dados. Ela apenas desvia para o programa monitor, para que este assuma o controle do kit Esta instrução deve ser utilizada sempre no final dos seus programas executados no kit. MM – Microprocessadores e Microcontroladores – Roteiro da Experiência 2 3 EXPERIÊNCIA 2 – QUESTÕES ADICIONAIS 1) A instrução 1 desta experiência tem código de máquina 74 28, e mnemônico MOV A, #28h. Se o mnemônico fosse MOV A, #40, o código de máquina dessa instrução seria exatamente o mesmo. Por quê? 2) Apresente o mnemônico da instrução que carrega o valor 28h no registrador R1. 3) Qual a diferença entre as instruções MOV A, #28h e MOV A, 28h? 4) Qual a diferença entre as instruções MOV @R1, A e MOVX @R1, A? Qual delas é capaz de alterar o valor de um registrador? 5) Suponha que os registradores A e R1 tenham, respectivamente, os valores 30h e 01h, e que esteja selecionado o banco 0 dos registradores R0-R7. Indique o que faz cada instrução da seguinte seqüência, justificando por que seus efeitos são diferentes, apesar de elas serem iguais. MOV @R1, A MOV @R1, A 6) Embora exista a instrução MOVX @DPTR, A, justifique por que não faz sentido (e, portanto, não existe) a instrução MOV @DPTR, A. (“dica”: o registrador DPTR tem 16 bits, mas a RAM interna só tem 128 bytes) 7) desafio: Suponha que haja uma tabela de bytes armazenada na área de código (programa), com início na posição 5800H. Forneça os mnemônicos da seqüência de instruções que obtém o valor do elemento da tabela apontado pelo registrador R4, e armazena esse valor na posição 160 da memória de dados externa.