1. SINTAXE DA LINGUAGEM ASSEMBLY Antes de se escrever em assembly, é conveniente construir um fluxograma do programa. Um fluxograma não faz referência à linguagem a utilizar, pelo que pode ser utilizado para programar qualquer microprocessador em qualquer linguagem. Os fluxogramas ajudam a dividir um programa grande em subprogramas, permitindo também visualizar de uma forma mais clara a construção do software para um projeto específico, o que conduz a uma implementação mais fácil. A linguagem assembly é usualmente escrita numa forma standard para que possa ser transladada para a linguagem máquina especifica, utilizando um compilador, denominado assembler, esta forma standard tem 4 campos: O primeiro campo denominado label é um nome utilizado para representar um endereço, ou uma rotina, os assemblers impõem restrições à constituição dos nomes para os labels, muito devido ao fato de serem ainda programas que desenvolvidos para funcionarem sobre o sistema operativo MS-DOS e as restrições são mais relativas ao próprio sistema operativo que ao assembler em sim mesmo. O campo OP-Code (Operation Code) contêm os mnemônicos das instruções ou caso prefiram o op.code, cada família de processadores tem o seu conjunto especifico de instruções. Os campos dos operandos contêm os registros, dados, ou endereços sendo utilizado uma virgula para separar os operandos. O ultimo campo é o dos comentários, o comentário de linha é inicializado por um ponto e virgula. Os comentários não geram código executável, servem para auxiliar o programador na construção do programa. É impensável escrever um programa sem comentários, sob o risco de se este se tornar completamente indecifrável para o próprio programador. Os comentários devem explicar o que a instrução ou conjuntos de instruções fazem. As rotinas devem ser comentadas com nome de rotina, a sua função, as suas entradas e saídas bem como registros utilizados. 1.1 Sub-Rotinas Quando um conjunto de instruções se repete várias vezes são convenientes à utilização de sub-rotinas, em que o código só é escrito uma única vez. Uma rotina começa com um label e termina sempre com a instrução RET, para se chamar à rotina é utilizada a instrução call label. Quando da chamada da sub-rotina o processador guarda na pilha o endereço da próxima instrução a ser executada, ou seja, o conteúdo do registro PC (Program Counter), seqüencialmente PCL e PCH, e carrega o PC com o endereço representado pelo label, O que significa que o processador continua a execução a partir do endereço representado por label. Quando depois de executar a rotina encontra a instrução RET, o processador carrega o PC com os valores que estão no topo da pilha, a execução continua a partir da instrução imediatamente a seguir à chamada da sub-rotina.
1.2 Desenvolvimento de um programa Para construir um programa para ser executado por um processador é necessário em primeiro lugar utilizar um processador de texto, para escreve o código fonte (instruções). Depois de escrito é necessário, utilizar um assembler que gere o código máquina, este assembler gera um documento objeto com o código das instruções em binário, e um documento de documentação que indica a localização do código na memória de programa variável utilizados banco de registros utilizados... Como o programa para ser executado é necessário ser carregado pela CPU, dependendo agora da forma de efetuar este mecanismo, é comum ser necessário converter o código maquina para um documento de formato denominado intel-hex que é compreendido pelos programadores de eprom.s, para isso é utilizado um utilitário, que permite efetuar essa conversão. 1.3 Diretivas do assembler De modo a disponibilizar o programa completamente pronto para o assembler, este deve dar algumas indicações ao assembler, por exemplo, deverá indicar onde ficam colocadas as instruções na memória de programa, quando é termina o programa... A estes comandos são designadas por diretivas do assembler, as diretivas à semelhança dos comentários não geram código executável. A diretiva ORG é seguida de um endereço que indica ao assembler, qual o endereço onde deve ser colocado o código correspondente ás instruções a seguir à diretiva ORG, é comum no caso do 8051 colocar a diretiva ORG 0000h, pois o endereço de reset do 8051 é a posição 0000h, será neste endereço que o processador vai executar a primeira instrução. A diretiva END indica ao processador que o programa terminou, ou seja, a partir dessa diretiva não é gerado mais código. A diretiva EQU define um símbolo usado para definir uma constante atribuindo um nome a uma constante, ou para definir uma variável atribuindo um nome a uma posição de memória. segundos equ 030h A diretiva db define byte, permite guardar os dados contidos no operando na memória de programa exemplo: mem db 07fh, 32h,40h db micro Guarda os bytes 7fh,32h,40h consecutivamente na memória de programa a partir dos endereços mem, db.micro., guarda o código ASCII correspondente às letras.micro., dw define word guarda em vez dos 8 bits de db, 16 bits em 2 posições consecutivas de memória, sendo o byte menos significativo guardado sempre na posição de memória de endereço menos significativo. 1.4 Macros À semelhança das sub-rotinas os macros também permitem substituir grupos de instruções que necessitem de ser repetidas várias vezes, um macro é simplesmente um conjunto de instruções com uma sintaxe especifica. teste macro A1... endm Na escrita do programa sempre que se pretender chamar a macro é só escrever o seu nome, neste caso teste. Ao contrário do que sucede com as sub-rotinas aqui nos macros o assembler substitui a chamada do macro pelo código, comparando com a utilização das sub-rotinas, é mais eficiente, pois não existe a instrução de salto nem a de retorno que torna o programa mais eficiente, tem, contudo o
inconveniente de aumentar a memória de programa, pois cada chamada implica a colocação de todo o código que constitui a macro. 1.5 Detecção de erros depuração Depois de compilar o programa caso não existam erros de sintaxe o programa pode ser executado pelo processador. Antes ainda de o testar diretamente no processador e verificar a sua funcionalidade, podem utilizando um simulador executa o programa no PC e fazer a sua depuração da sua execução, como por exemplo, o DS51 da Keil Software. 2. CONJUNTO DE INSTRUÇÕES DO 8051 2.1 Modos de endereçamento Todos os membros da família 8051 executam o mesmo conjunto de instruções. Estas instruções estão otimizadas para aplicações de 8-bits. São disponibilizados vários modos de endereçamento para acesso à memória e registros. O conjunto de instruções disponibiliza também operações bit a bit, em que a flag de carry, faz o papel desempenhado pelo acumulador em outras instruções. Endereçamento direto No endereçamento direto o operando é especificado num registro de 8 bits. Só a RAM interna e os registros de funções especiais podem utilizar este modo de endereçamento. Endereçamento Indireto Neste modo o operando especifica um registro que contem o endereço. Ambas RAM.s internas e externa podem ser indiretamente endereçadas. Os registros de endereços para 8 bits podem ser R0 ou R1, do respectivo banco que estiver selecionado ou Stack Pointer SP. No caso do endereço ser de 16 bits só pode ser utilizado o data pointer DPTR. Instruções de registros Existem instruções que permitem o acesso aos registros de R0 a R7. Como são possíveis 8 registros significa que podemos indicar qual o registro pretendido nessas instruções em apenas três bits. Instruções que podem aceder aos registros
nessa forma são eficientes no código, pois fazem com que se elimine o byte normalmente necessário para representar o endereço. Instruções especificas a registros Há instruções que são especificas a certos registros, por exemplo, algumas apenas operam com o acumulador ou com o DPTR, o op-code da instrução por si só faz isso. Endereçamento Imediato Quando um valor constante é utilizado como operando. aritméticas, lógicas e de transferência de dados. É comum em operações Endereçamento Indexado Aqui só a memória de programa pode ser acedida com este modo de endereçamentos como é obvio só pode ser utilizado para leitura. Este modo é direcionado para utilização com look-up tables, em que se pode usar como referencia da tabela o PC program counter ou o DPTR data pointer. Apresenta-se seguidamente o conjunto de instruções completo em que há a referir: Rn - representa qualquer registro de R0 a R7, recorde-se que a seleção do Banco de registros de R0 a R7 é efetuado em PSW. Ri - representa o registro R0 ou R1 direto - qualquer posição da memória RAM (representa um endereço) #data -constante de 8 bits #data16 -constante de 16 bits rel - salto relativo possível para 128 ou +127 Addr11 - Endereço (posição de memória de programa) limitado a 11bits Addr16 - Identifica qualquer posição da memória de programa (16 bits)
2.2 Instruções aritméticas
2.3 Instruções lógicas
2.4 Instruções de Transferência de dados
2.5 Instruções booleanas 2.6 Instruções de salto
2.7 Instruções que afetam as flags São indicada na figura as instruções do 8051 que afetam as flags. Em que 0, significa que a flag correspondente è colocada a.0., 1 significa que é colocada a.1. e., significa que depende do resultado da operação. Referências Secure Microcontrollers- Dallas Semiconductor, 2000 Embedded Microcontrollers and Processors, Volume I Intel, 1996