Sistemas Embarcados - Modos de Endereçamento
A addressing moderefere-se a como você está endereçando um determinado local de memória. Existem cinco maneiras diferentes ou cinco modos de endereçamento para executar esta instrução, que são os seguintes -
- Modo de endereçamento imediato
- Modo de endereçamento direto
- Registrar modo de endereçamento direto
- Registrar modo de endereçamento indireto
- Modo de endereçamento indexado
Modo de endereçamento imediato
Vamos começar com um exemplo.
MOV A, #6AH
Em geral, podemos escrever,
MOV A, #data
É denominado como immediate porque os dados de 8 bits são transferidos imediatamente para o acumulador (operando de destino).
A ilustração a seguir descreve a instrução acima e sua execução. O opcode 74H é salvo no endereço 0202. Os dados 6AH são salvos no endereço 0203 na memória do programa. Depois de ler o opcode 74H, os dados no próximo endereço de memória de programa são transferidos para o acumulador A (E0H é o endereço do acumulador). Como a instrução é de 2 bytes e é executada em um ciclo, o contador do programa será incrementado em 2 e apontará para 0204 da memória do programa.
Note- O símbolo '#' antes de 6AH indica que o operando é um dado (8 bits). Na ausência de '#', o número hexadecimal seria considerado um endereço.
Modo de endereçamento direto
Essa é outra maneira de endereçar um operando. Aqui, o endereço dos dados (dados de origem) é fornecido como um operando. Vamos dar um exemplo.
MOV A, 04H
O banco de registros # 0 (4º registro) possui o endereço 04H. Quando a instrução MOV é executada, os dados armazenados no registro 04H são movidos para o acumulador. Como o registro 04H contém os dados 1FH, 1FH é movido para o acumulador.
Note- Não usamos '#' no modo de endereçamento direto, ao contrário do modo imediato. Se tivéssemos usado '#', o valor dos dados 04H teria sido transferido para o acumulador em vez de 1FH.
Agora, dê uma olhada na ilustração a seguir. Mostra como a instrução é executada.
Conforme mostrado na ilustração acima, esta é uma instrução de 2 bytes que requer 1 ciclo para ser concluída. O PC será incrementado em 2 e apontará para 0204. O opcode para a instrução MOV A, endereço é E5H. Quando a instrução em 0202 é executada (E5H), o acumulador fica ativo e pronto para receber dados. Em seguida, o PC vai para o próximo endereço como 0203 e procura o endereço do local de 04H onde os dados de origem (a serem transferidos para o acumulador) estão localizados. Às 04H, o controle encontra os dados 1F e os transfere para o acumulador e, portanto, a execução é concluída.
Registrar modo de endereçamento direto
Neste modo de endereçamento, usamos o nome do registro diretamente (como operando de origem). Vamos tentar entender com a ajuda de um exemplo.
MOV A, R4
Por vez, os registros podem assumir valores de R0 a R7. Existem 32 desses registros. Para usar 32 registradores com apenas 8 variáveis para endereçar registradores, bancos de registradores são usados. Existem 4 bancos de registradores nomeados de 0 a 3. Cada banco compreende 8 registradores nomeados de R0 a R7.
Ao mesmo tempo, um único banco de registro pode ser selecionado. A seleção de um banco de registro é possível através de umSpecial Function Register (SFR) nomeado Processor Status Word(PSW). PSW é um SFR de 8 bits onde cada bit pode ser programado conforme necessário. Os bits são designados de PSW.0 a PSW.7. PSW.3 e PSW.4 são usados para selecionar bancos de registro.
Agora, dê uma olhada na ilustração a seguir para obter uma compreensão clara de como funciona.
Opcode EC é usado para MOV A, R4. O opcode é armazenado no endereço 0202 e quando é executado, o controle vai diretamente para R4 do banco de registros respeitado (que é selecionado no PSW). Se o banco de registro # 0 for selecionado, os dados de R4 do banco de registro # 0 serão movidos para o acumulador. Aqui, 2F é armazenado às 04H. 04H representa o endereço de R4 do banco de registro # 0.
O movimento de dados (2F) é destacado em negrito. 2F está sendo transferido para o acumulador da localização de memória de dados 0C H e é mostrado como uma linha pontilhada. 0CH é a localização do endereço do Registrador 4 (R4) do banco de registros # 1. A instrução acima tem 1 byte e requer 1 ciclo para execução completa. Isso significa que você pode economizar memória de programa usando o modo de endereçamento direto de registro.
Registrar modo de endereçamento indireto
Neste modo de endereçamento, o endereço dos dados é armazenado no registro como operando.
MOV A, @R0
Aqui, o valor dentro de R0 é considerado um endereço, que contém os dados a serem transferidos para o acumulador. Example: Se R0 tem o valor 20H, e os dados 2FH são armazenados no endereço 20H, então o valor 2FH será transferido para o acumulador após a execução desta instrução. Veja a ilustração a seguir.
Portanto, o opcode para MOV A, @R0é E6H. Assumindo que o banco de registro # 0 está selecionado, o R0 do banco de registro # 0 contém os dados 20H. O controle do programa se move para 20H, onde localiza os dados 2FH e transfere 2FH para o acumulador. Esta é uma instrução de 1 byte e o contador do programa é incrementado em 1 e vai para 0203 da memória do programa.
Note- Apenas R0 e R1 podem formar uma instrução de endereçamento indireto de registro. Em outras palavras, o programador pode criar uma instrução usando @ R0 ou @ R1. Todos os bancos de registro são permitidos.
Modo de endereçamento indexado
Tomaremos dois exemplos para entender o conceito de modo de endereçamento indexado. Dê uma olhada nas seguintes instruções -
MOVC A, @A+DPTR
e
MOVC A, @A+PC
onde DPTR é o ponteiro de dados e PC é o contador do programa (ambos são registradores de 16 bits). Considere o primeiro exemplo.
MOVC A, @A+DPTR
O operando de origem é @ A + DPTR. Ele contém os dados de origem deste local. Aqui estamos adicionando o conteúdo do DPTR com o conteúdo atual do acumulador. Esta adição fornecerá um novo endereço que é o endereço dos dados de origem. Os dados apontados por este endereço são então transferidos para o acumulador.
O opcode é 93H. DPTR tem o valor 01FE, onde 01 está localizado no DPH (8 bits mais altos) e FE está localizado no DPL (8 bits mais baixos). O acumulador tem o valor 02H. Em seguida, uma adição de 16 bits é realizada e 01FE H + 02H resulta em 0200 H. Os dados no local 0200H serão transferidos para o acumulador. O valor anterior dentro do acumulador (02H) será substituído pelos novos dados de 0200H. Os novos dados no acumulador são destacados na ilustração.
Esta é uma instrução de 1 byte com 2 ciclos necessários para a execução e o tempo de execução necessário para esta instrução é alto em comparação com as instruções anteriores (que eram todas de 1 ciclo cada).
O outro exemplo MOVC A, @A+PCfunciona da mesma maneira que o exemplo acima. Em vez de adicionar DPTR com o acumulador, aqui os dados dentro do contador do programa (PC) são adicionados com o acumulador para obter o endereço de destino.