Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Assembly cap6, Notas de estudo de Engenharia Telemática

Instruções de controle de fluxo

Tipologia: Notas de estudo

2010

Compartilhado em 30/11/2010

samuel-santos-22
samuel-santos-22 🇧🇷

4.6

(41)

262 documentos

Pré-visualização parcial do texto

Baixe Assembly cap6 e outras Notas de estudo em PDF para Engenharia Telemática, somente na Docsity! Cap6 – Instruções de controle de fluxo. Página 1 de 12 6. Instruções de controle de fluxo Instruções de laço (loop) e de salto (jump) permitem que: • o programa "tome" certas decisões, alterando seu curso; • certas partes de um programa sejam repetidas um número controlado de vezes; • permite implementar a “inteligência” de qualquer algorítmo. Exemplo preliminar: exibição na tela de todos os caracteres ASCII. TITLE EXIBICAO DE CARACTERES ASCII .MODEL SMALL .STACK 100h .CODE ;inicializacao de alguns registradores ; MOV AH,2 ;funcao DOS para exibicao de caracter MOV CX,256 ;contador com o numero total de caracteres MOV DL,00h ;DL inicializado com o primeiro ASCII ; ;definicao de um processo repetitivo de 256 vezes ; PRINT_LOOP: INT 21h ;exibir caracter na tela INC DL ;incrementa o caracter ASCII DEC CX ;decrementa o contador JNZ PRINT_LOOP ;continua exibindo enquanto CX nao for 0 ; ;quando CX = 0, o programa quebra a sequencia do loop ;saida para o DOS ; MOV AH,4Ch INT 21h END Cap6 – Instruções de controle de fluxo. Página 2 de 12 6.1 A instrução de comparação CMP destino,fonte CMP (Compare) compara os conteúdos destino e fonte, que podem ser: • registrador e registrador • registrador e uma posição de memória • um número diretamente como operando fonte Combinações legais de operandos: Operando destino Operando fonte Registrador de dados Posição de memória Reg. de dados sim Sim Posição de memória sim Não Constante sim Sim CMP calcula a subtração: (destino) - (fonte) Todos os Flags de Estado são afetados e o resultado não é armazenado. Exemplos de instruções válidas: CMP DX,BX ;compara os conteúdos de DX e BX CMP AX,WORD1 ;compara o conteúdo do registrador AX com o da ;posição de memória WORD1 CMP AH,’A’ ;compara o conteúdo de AH com o caracter ASCII ‘A’ Cap6 – Instruções de controle de fluxo. Página 5 de 12 6.3 Diferença entre Saltos sinalizados e não-sinalizados a) Trecho de programa que supõe quantidades não-sinalizadas: ;supondo que AX contem 7FFFh e BX contem 8000h ... CMP AX,BX JA PT2 ;o salto não ocorre porque 7FFFh < 8000h ... ... PT2: MOV ... ;continuação do programa b) Trecho de programa que supõe quantidades sinalizadas: ;supondo que AX contem 7FFFh e BX contem 8000h ... CMP AX,BX JG PT2 ;o salto ocorre porque 7FFFh (+) > 8000h (-) ... ... PT2: MOV ... ;continuação do programa Exemplo: Supondo que AX e BX contenham números sinalizados, escreva um trecho de programa que coloque o maior deles em CX. ... MOV CX,AX ;AX já é pressuposto ser o maior deles CMP AX,BX JNL ABAIXO ;poderia ser também JGE ABAIXO MOV CX,BX ;caso BX seja de fato o maior deles ABAIXO: ... ;continuação do programa ... Cap6 – Instruções de controle de fluxo. Página 6 de 12 6.4 Salto incondicional JMP rótulo_de_destino • Rótulo_de_destino é uma posição no programa, no mesmo segmento de código onde JMP aparece • Não há restrição de faixa de endereçamento como em JXXX • JMP pode ajudar a solucionar o problema de faixa de endereçamento das instruções JXXX Exemplo: trecho utilizando JMP e JXXX TOPO: ... ;mais do que 126 bytes de instruções: limitação para JXXX ... ;corpo de algum laço ; DEC CX JNZ ABAIXO JMP CONTINUA ABAIXO: JMP TOPO CONTINUA: MOV ... ;programa continua ... Cap6 – Instruções de controle de fluxo. Página 7 de 12 6.5 Uma instrução de laço especial - LOOP. LOOP rótulo_de_destino • Tem como contador implícito o registrador CX, que deve ser inicializado antes do laço. • Salta para rótulo_de_destino enquanto o conteúdo de CX não for zero. • Quando CX = 0, a próxima instrução após LOOP será executada. • CX é decrementado automaticamente quando LOOP é executada. • Nenhum FLAG é afetado. Exemplo de instruções válidas: LOOP PT1 LOOP TOPO LOOP RETORNO Obs: são equivalentes as seqüências MOV CX, (valor_inicial) MOV CX, (valor_inicial) TOPO: ... TOPO: ... ... ... LOOP TOPO DEC CX JNZ TOPO Cap6 – Instruções de controle de fluxo. Página 10 de 12 2) FOR loop Em linguagem de alto nível: FOR (número_de_vezes) DO (seqüência de instruções) END_FOR Exemplo: Exiba uma seqüência de 80 asteriscos no monitor de vídeo. Em linguagem de alto nível: FOR (80 vezes) DO (exibir “ * “ ) END_FOR Em linguagem montadora: ... ;for 80 vezes MOV CX,80d MOV AH,2h MOV DL,” * ” ;do TOPO: INT 21h LOOP TOPO ;end_for ... Exercício: modifique o programa que exibe todos os caracteres ASCII (página 1 deste capítulo), utilizando apenas a instrução LOOP. Cap6 – Instruções de controle de fluxo. Página 11 de 12 3) WHILE loop Em linguagem de alto nível: WHILE (condição_verdadeira) DO (seqüência de instruções) END_WHILE Exemplo: Ler caracteres ASCII do teclado, contando sua quantidade, até que o caracter Carriage Return (CR) apareça. Em linguagem de alto nível: WHILE (caracter diferente de CR) DO (ler caracter do teclado e armazená-lo) (contador = contador +1) END_WHILE Em linguagem montadora: ... MOV DX,0h ;inicialização do contador MOV AH,1h INT 21h ;lê o primeiro caracter em AL ;while LOOP: CMP AL,0Dh ;é o caracter CR? JE FIM ;salto quando caracter é igual a CR MOV (algum lugar), AL ;salvando o caracter lido INC DX ;conta número de caracteres INT 21h ;lê o próximo caracter em AL JMP LOOP ;fecha o laço WHILE ;end_while FIM: Cap6 – Instruções de controle de fluxo. Página 12 de 12 4) REPEAT loop Em linguagem de alto nível: REPEAT (seqüência de instruções) UNTIL (condição_verdadeira) Exemplo: Ler caracteres ASCII do teclado, contando sua quantidade, até que o caracter Carriage Return (CR) apareça. Em linguagem de alto nível: REPEAT (ler caracter do teclado e armazená-lo) (contador = contador + 1) UNTIL (caracter igual a CR) Em linguagem montadora: ... MOV DX,0h ;inicialização MOV AH,1h ;repeat LOOP: INT 21h ;lê um caracter em AL MOV (algum lugar),AL ;salvando o caracter lido INC DX ;conta número de caracteres CMP AL,0Dh ;é o caracter CR? JNE LOOP ;salto enquanto caracter não é CR ;until ... Obs: O laço é realizado ao menos uma vez; o caracter CR é armazenado.
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved