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

Antes de 2010

Compartilhado em 30/11/2010

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

4.6

(41)

262 documentos

1 / 12

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
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ênciade 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
pf3
pf4
pf5
pf8
pf9
pfa

Pré-visualização parcial do texto

Baixe Assembly cap6 e outras Notas de estudo em PDF para Engenharia Telemática, somente na Docsity!

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

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 WORD CMP AH,’A’ ;compara o conteúdo de AH com o caracter ASCII ‘A’

Tipos de saltos condicionais Símbolo Descrição Condições Saltos sinalizados JG ou JNLE salto se maior do que OU salto se não menor do que ou igual a

ZF = 0 E

SF = OF

JGE ou JNL salto se maior do que ou igual a OU salto se não menor do que

SF = OF

JL ou JNGE salto se menor do que OU salto se não maior do que ou igual a

SF ≠ OF

JLE ou JNG salto se menor do que ou igual a OU salto se não maior do que

ZF = 1 OU

SF ≠ OF

Saltos não-sinalizados JA ou JNBE salto se acima de OU salto se não abaixo de ou igual a

CF = 0 E

ZF = 0

JAE ou JNB salto se acima de ou igual a OU salto se não abaixo de

CF = 0

JB ou JNAE salto se abaixo de OU salto se não acima de ou igual a

CF = 1

JBE ou JNA salto se abaixo de ou igual a OU salto se não acima de

CF = 1 OU

ZF = 1

Saltos de Flag simples JE ou JZ salto se igual OU salto se igual a zero

ZF = 1

JNE ou JNZ salto se não igual OU salto se não igual a zero

ZF = 0

JC salto se há VAI-UM ( carry ) CF = 1 JNC salto se não há VAI-UM ( not carry ) CF = 0 JO salto se há overflow OF = 1 JNO salto se não há overflow OF = 0 JS salto se o sinal é negativo SF = 1 JNS salto se o sinal é não-negativo (+) SF = 0 JP ou JPE salto se a paridade é PAR ( even ) PF = 1 JNP ou JPO salto se a paridade é IMPAR ( odd ) PF = 0

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 ...

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 PT 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

6.6 Atividades práticas.

  1. Escreva um programa que apresente uma '?', leia em seguida duas letras maiúsculas e exiba-as na próxima linha, em ordem alfabética.
  2. Modifique o programa de exibição de caracteres ASCII (página 1), de forma a exibir 16 caracteres por linha separados por espaços em branco.
  3. Escreva um programa que peça ao usuário para teclar um dígito hexadecimal, exiba na próxima linha o seu valor decimal e pergunte ao usuário se deseja continuar a utilizar o programa: se for digitado S (sim), o programa se repete desde o começo; se for digitado outro caracter, o programa termina. Teste se o dígito hexa está na faixa de valores correta. Se não estiver, exiba uma mensagem para o usuário tentar de novo.
  4. Crie um trecho de código modificando o programa do exercício (3) acima, tal que se o usuário falhar em entrar com um dígito hexa na faixa correta mais do que três tentativas, o programa exibe uma mensagem adequada e termina.
  5. Crie um programa que implemente uma multiplicação por meio de somas sucessivas. Faça as considerações que achar necessárias.
  6. Crie um programa que implemente uma divisão por meio de subtrações sucessivas, exibindo o quociente e o resto com mensagens adequadas. Faça as considerações que achar necessárias.

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.

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: