Assembly 8051 Aplicações de Microprocessadores 2006/2007 Sintaxe do Assembly [Label] tabela: 2 movc Op-code a,@a+dptr [Operando] [Comentário] ; vai à tabela buscar o seu correspondente ASCII 2 Instruções que afectam Flags 3 3 1 4 4 Endereçamento directo z No endereçamento directo o operando é especificado num registo de 8 bits. Só a RAM interna e os registos de funções especiais podem utilizar este modo de endereçamento add a,7fh anl 7fh,a push pop 7fh 7fh 5 ;soma Acc com o conteúdo de 7fh, resultado ;em Acc ;faz o‘e’lógico entre o conteúdo de 7fhe ;Acc, resultado em 7fh ; coloca o conteúdo de 7fh na pilha ; retira da pilha para 7fh 5 Endereçamento Indirecto z 6 Neste modo o operando especifica um registo que contem o endereço. Ambas RAM’s internas e externa podem ser indirectamente endereçadas. Os registos de endereços para 8 bits podem ser R0 ou R1, do respectivo banco que estiver seleccionado ou Stack Pointer SP. No caso do endereço ser de 16bits só pode ser utilizado o data pointer DPTR. add a,@r0 mov a,@r0 movx a,@r1 ; Soma Acc com o conteúdo da posição de memória cujo ; endereço está em r0, resultado em Acc ; move o conteúdo da posição de memória cujo endereço está ; r0, resultado em Acc ; move o conteúdo da posição de memória (externa) cujo e ; endereço está em r0, resultado em Acc 6 2 Instruções de Registos z Existem instruções que permitem o acesso aos registos de R0 a R7. Como são possíveis 8 registos significa que podemos indicar qual o registo pretendido nessas instruções em apenas três bits. mov anl addc r7,a 7fh,r0 a,r0 7 ; move de Acc para r7 ; faz o ‘e’ lógico de r0 com o conteúdo de 7fh ; soma r0 a Acc mais o bit de carry, resultado ; em Acc 7 Instruções especificas a registos z Há instruções que são específicas a certos registos, por exemplo algumas apenas operam com o acumulador ou com o DPTR, o op-code da instrução por si só faz isso. clr swap inc 8 a a dptr ; coloca o acumulador a zero ; troca nibbles em Acc ; incrementa o dptr 8 Endereçamento Imediato z Quando um valor constante é utilizado como operando. É comum em operações aritméticas, lógicas e de transferência de dados mov anl subb 9 a, #100 ;coloca 100 decimal em Acc a, #11110000b ; coloca a zero os 4 bits menos ; significativos Acc a,#0ah ; subtraí 0ah de Acc e carry e coloca, ; resultado em Acc 9 3 Endereçamento Indexado z Aqui só a memória de programa pode ser acedida com este modo de endereçamentos como é óbvio só pode ser utilizado para leitura. Este modo é direccionado para utilização com look-up tables, em que se pode usar como referência da tabela o PC program counter ou o DPTR data pointer movc a, @a+dptr movc a, a+pc ; coloca em Acc o conteúdo da posição de ; memória de programa apontado pela ; soma de dptr e de Acc ; coloca em o conteúdo da posição de ; memória de programa apontado pela ; soma de pc e de Acc 10 10 8051-SET.PDF Ocupação na memória de programa Tempo de execução 11 11 8051-SET.PDF Ocupação na memória de programa Código Máquina 12 12 4 Grupos de Instruções z z z z z Aritméticas Lógicas Transferência de dados Variáveis Boleanas (ao bit) Saltos e controlo de fluxo de programa 13 13 Aritméticas 14 14 Aritméticas 15 15 5 Aritméticas 16 16 Lógicas 17 17 Lógicas 18 18 6 Lógicas 19 19 Lógicas 20 20 Lógicas 21 21 7 Lógicas 22 22 Transferência 23 23 Transferência 24 24 8 Transferência 25 25 Transferência 26 26 Boleanas 27 27 9 Salto e de controlo 28 28 Salto e de controlo 29 29 Rotinas rotina: … … ret PC=[rotina] PC=[proxima instrução] Lcall rotina ; proxima instrução Quando da chamada de rotina, o endereço da próxima instrução a ser executada é guardado na pilha e o PC toma o valor de endereço da rotina. Quando a rotina termina, instrução RET o valor do topo da pilha é 30 restaurado em PC. 30 10 Exemplo de “look-up table” 31 31 Exemplo ;***************************************************************************** ;** Nome: converte_ASCII ;** Descrição: Faz a conversão de um numero de 0-9 para equivalente ASCII ;** Entradas: Em A numero a converter ;** Saídas: Em A o seu equivalente em ASCII ;** Registos utilizados: a,dptr ;***************************************************************************** converte_ASCII: Lcall db tabela: pop pop movc ret 32 tabela 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ; valores para a tabela dph dpl a,@a+dptr ; coloca o dptr a apontar para o inicio da tabela ; vai à tabela buscar o seu correspondente em ASCII 32 11