Microprocessadores são ‘Máquinas de Estado Seqüenciais Síncronas’ que operam mediante a execução de uma seqüência de códigos binários armazenados em memória. Prof. Adilson Gonzaga 1 • As ordens ou comandos compreendidos por um determinado Microprocessador, são INSTRUÇÕES seqüencialmente armazenadas na Memória. • Ao conjunto de Instruções compreendidos por um determinado Microprocessador dá-se dá o nome de “INSTRUCTION SET”. • Cada Microprocessador tem seu próprio INSTRUCTION SET que é em geral, diferente do INSTRUCTION SET de outro Microprocessador de fabricantes diferentes. 2 • Uma sequencia de Instruções do INSTRUCTION SET, armazenadas na memória e que realiza alguma operação, recebe o nome de PROGRAMA. • Cada Instrução do Microprocessador é um código binário formada em geral por um ou mais Bytes. • A cada código binário equivalente a uma Instrução está associado um Mnemônico para facilitar a compreensão da função que a Instrução executa. • Ao conjunto de Instruções e seus Mnemônicos equivalentes dá o nome de LINGUAGEM ASSEMBLY. dá-se 3 • Para a documentação lógica de um Programa em Assembly utiliza um Fluxograma ou Diagrama de Blocos. utiliza-se • Cada bloco do Fluxograma equivale a um sub-conjunto do INSTRUCTION SET do Microprocessador. • O Fluxograma é uma forma de se implementar logicamente um programa, antes que o mesmo seja codificado na Linguagem Assembly do Microprocessador. 4 • Linhas de Fluxo do Programa • Bloco de Processo Execute • Mostram a sequencia de execução das Instruções. • Cada Bloco do Fluxograma possui apenas uma linha de Fluxo de Entrada e uma ou duas de saída • Equivalem às Instruções que realizam alguma operação do tipo: - Movimento de Dados - Operação Aritmética - Operação Lógica 5 • Bloco de Decisão • Equivale às Instruções que decidem sobre o Fluxo do Programa. X = 0? F • Se a função dentro do bloco for Verdadeira(V) o programa continua abaixo, se for Falsa(F) o programa muda o fluxo. V 6 • Processo Pré-definido • Equivale às Instruções que mandam executar uma Sub-rotina Sub rotina armazenada em outro lugar da Memória. • Observe que quando a sub-rotina termina, o fluxo do programa continua normalmente. 7 • Bloco de Início de Programa • Bloco de Fim de Programa Início FIM • O Bloco de Início de Programa não equivale a uma Instrução específica do INSTRUCTION SET. • O Bloco de FIM equivale a uma instrução que termina o Programa. É chamado de FIM LÓGICO do Programa. 8 Início • O programa ao lado deve Ler um Dado da memória, verificar se é igual a zero. Se não for zero, continua em LOOP. Se for zero para par o programa. Ler o dado da Memória Dado = 0? F V Parar 9 • Para Codificar um Programa escrito através de um Fluxograma, deve-se escolher o Microprocessador, ou seja, conhecer seu Conjunto de Instruções. • Os Microcontroladores da família MCS-51 serão os dispositivos a serem aplicados nesta disciplina. 10 • Instruções equivalentes ao Bloco de Processo • Instruções Aritméticas Execute SUBB A, direct ADD A, Rn INC A DEC A DA A 11 • Instruções equivalentes ao Bloco de Processo • Instruções Lógicas ANL Execute A, Rn ORL A, direct A XRL A, #data CLR A CPL RL A SWAP A 12 • Instruções equivalentes ao Bloco de Processo • Instruções de Transferência de Dados Execute MOV A, Rn MOVX A,@DPTR PUSH direct XCH A, Rn MOVC POP A, @A+DPTR direct 13 • Instruções equivalentes ao Bloco de Decisão • Instruções de Desvio X = 0? V JZ rel CJNE A, direct, rel JC rel JNC rel JB bit, rel JNB bit, rel DJNZ Rn, rel F JNZ rel 14 • Instruções equivalentes ao Bloco de Processo Prédefinido • Instruções de Sub-Rotina LCALL addr16 ACALL addr11 RET RETI 15 • Instruções equivalentes a Mudança de Fluxo • Instruções de Saltos LJMP addr16 SJMP rel JMP @A+DPTR AJMP addr11 16 1. Endereçamento Imediato • Opera sobre o dado localizado na própria instrução • Identificado através do sinal • Exemplo: ADD # A,#30h O dado 30h é somado ao Registrador A 17 1. Endereçamento Imediato ADD A,#30h Registrador A 00 ADD A,#30h Registrador A 00 + 30h 30h 18 1. Endereçamento Imediato ADD A,#30h Memória Registrador A Programa 00 30 20 Operação 00 + 30 ADD A,#30h Registrador A Endereço Conteúdo (hexa) (hexa) 30 19 2. Endereçamento Direto • Opera sobre o dado cujo endereço está na instrução • Exemplo: ADD A,30h O dado armazenado no endereço 30h é somado ao Registrador A 20 2. Endereçamento Direto ADD A,30h Registrador A 00 ADD A,30h Conteúdo do Endereço 30h 20 Registrador A 00 + 20 20 21 2. Endereçamento Direto ADD A,30h Memória Registrador A Programa 00 30 20 Operação 00 + 20 ADD A,30h Registrador A Endereço Conteúdo (hexa) (hexa) 20 22 3. Endereçamento Indireto • Opera sobre o dado cujo endereço está armazenado em um Registrador apontado na instrução • Identificado através do sinal • Exemplo: ADD @ A,@R0 O dado armazenado no endereço apontado pelo Registrador R0 é somado ao Registrador A 23 3. Endereçamento Indireto ADD A,@R0 Registrador A 00 ADD A,@R0 Registrador R0 30h Conteúdo do Endereço 30h 20 Registrador A 00 + 20 20 24 3. Endereçamento Indireto ADD A,@R0 Memória Registrador A Programa 00 30 20 Operação 00 + 20 ADD A,@R0 Registrador R0 30h Registrador A Endereço Conteúdo (hexa) (hexa) 20 25 Início ORG 0 LOOP: Ler o dado da Memória MOV A,30H Dado = 0? CJNE A,#00,LOOP F V Parar AQUI: SJMP AQUI 26 Mnemônicos (Programa Assembly) ORG 0 LOOP: MOV A,30H COMPILADOR CJNE A,#00,LOOP AQUI: SJMP AQUI Código Compilado (Opcode) 27 Memória de Programa 00 E5 01 30 02 B4 03 00 04 FB 05 80 06 Endereço FE Conteúdo 28 Exemplo: Campo do Rótulo (Label) 29 Exemplo: Campo da Operação (Mnemônicos) 30 Exemplo: Campo do Operando 31 Exemplo: Campo do Comentário 32 Exemplo: 33 34 35 São utilizadas para complementar as informações que permitam a montagem efetiva do programa. • Indicar o Endereço Inicial do Programa. • Reservar área de Dados • Definir equivalência entre valores • Etc… 36 Principais Diretivas: 37 Principais Diretivas: Exemplo: Armazena na posição 0010h da Memória de Programa, o Byte 05h e na posição seguinte (0011h) o Byte CFh 38 Principais Diretivas: 39 Principais Diretivas: 40 Principais Diretivas: 4) Diretiva EQU ---- (Equate) Igual • Atribui um valor a um literal. literal EQU valor • O literal só pode receber um único valor. • O valor pode ser um valor numérico ou uma expressão. • Uma vez declarado o valor do literal este não poderá ser redefinido. Exemplo: ORG 0 Controle Controle EQU 10h ; atribui 10h ao literal MOV A, #Controle ; Acumulador = 10h 41 42 43 44 CONTROLE DE FLUXO DE PROGRAMA Comparação de Bytes A instrução CJNE (compare e salte se não for igual) faz o flag de carry = 1 depois da execução, se o dado em comparação for maior que o conteúdo do registrador em questão (A, Rn ou @Ri). CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE @Ri,#data,rel 45 CONTROLE DE FLUXO DE PROGRAMA Test: Valor. Test: Test: Else: Valor. Test: CJNE JC A,Valor,Test LT ;Desvie se A < Valor. CJNE A,Valor,Test ;Desvie se A >= JNC GTE CJNE SJMP JNC ----- A,Valor,Test Else GT ;Desvie se A > Valor. CJNE A,Valor,Test ;Desvie se A <= SJMP JC LTE LTE 46 Teste de Bits Testa o bit e salta para o endereço rel se bit=1 JB bit,rel SAI: ORG 0 JB P1.0,SAI SJMP CONT ------ 47 Teste de Bits Testa o bit e salta para o endereço rel se bit=0 JNB bit,rel SAI: ORG 0 JNB P1.0,SAI SJMP CONT ------ 48 Teste de Bits Testa o bit , salta para o endereço rel se bit=1 e complementa o bit JBC bit,rel SAI: ORG 0 JBC P1.0,SAI SJMP CONT ------ 49 DADOS ARMAZENADOS NA MEMÓRIA DE PROGRAMA Dados são armazenados na Memória de Programa somente usando as Psudo-Instruções DB ou DW, durante a fase de gravação do programa. Existem duas instruções apenas que permitem ler estes dados armazenados na Memória de Programa MOVC A, @A+DPTR MOVC A, @A+PC 50 EXEMPLO: Somar dois dados armazenados na Memória de Programa. 51 Estrutura de Programação Assembly Programa Principal Sub-rotina1 Chamada de Sub-rotina1 Programa Principal Chamada de Sub-rotina2 Sub-rotina2 Programa Principal Chamada de Sub-rotina3 Programa Principal Sub-rotina3 •É um procedimento estabelecido pelo programador que executa alguma tarefa específica. • Cada chamada de dentro do Programa Principal causa um desvio automático para o endereço da sub-rotina chamada. • Ao terminar a execução da sub-rotina o Contador de Programa (PC) retorna a execução para a próxima instrução dentro do Programa Principal, após a instrução de chamada. • O endereço de retorno da Sub-rotina é armazenado na Pilha no endereço apontado pelo Stack Pointer (SP). Exemplo: $ ACALL muda a execução do programa para o endereço da sub-rotina DELAY RET retorna a execução do programa para a próxima instrução abaixo da chamada ACALL O endereço de retorno (posição da instrução MOV A#00) é armazenado na Pilha definida por SP e recuperado pela instrução RET Sub-rotinas re-entrantes • De dentro de uma Sub-rotina pode ser chamada outra subrotina. A cada chamada um endereço de retorno é armazenado na Pilha. A cada retorno o endereço é removido da Pilha. Exemplo: $ ERROS COMUNS!!!!!!! $ ????? Saltar com JUMP para dentro de Sub-rotinas. Conseqüência: O PC será carregado com o último valor armazenado na PILHA (???). O programa se perderá. ERROS COMUNS!!!!!!! Saltar de Sub-rotinas com JUMP para dentro de Programas. Conseqüência: Estouro da PILHA