Você está na página 1de 12

Cap6 Instrues de controle de fluxo.

6. Instrues de controle de fluxo


Instrues de lao (loop) e de salto (jump) permitem que:

o programa "tome" certas decises, alterando seu curso; certas partes de um programa sejam repetidas um nmero controlado de vezes; permite implementar a inteligncia de qualquer algortmo.

Exemplo preliminar: exibio 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

Pgina 1 de 12

Cap6 Instrues de controle de fluxo.

6.1 A instruo de comparao CMP destino,fonte CMP (Compare) compara os contedos destino e fonte, que podem ser: registrador e registrador registrador e uma posio de memria um nmero diretamente como operando fonte Combinaes legais de operandos: Operando fonte Reg. de dados Posio de memria Constante CMP calcula a subtrao: Operando destino Registrador de Posio de dados memria sim Sim sim No sim Sim

(destino) - (fonte)

Todos os Flags de Estado so afetados e o resultado no armazenado. Exemplos de instrues vlidas: CMP DX,BX CMP AX,WORD1 CMP AH,A ;compara os contedos de DX e BX ;compara o contedo do registrador AX com o da ;posio de memria WORD1 ;compara o contedo de AH com o caracter ASCII A

Pgina 2 de 12

Cap6 Instrues de controle de fluxo.

6.2 Saltos condicionais JXXX rtulo_de_destino

XXX uma condio dependente de algum dos Flags de Estado Se a condio XXX verdadeira: - a prxima instruo a ser executada aquela definida pelo rtulo_de_destino; - a CPU ajusta o registrador IP para apontar para a posio de memria dada por rtulo_de_destino. Se a condio XXX falsa: - a prxima instruo aquela que imediatamente segue o salto. Faixa de endereamento do rtulo_de_destino: - deve preceder JXXX no mais do que 126 bytes; - deve suceder JXXX no mais do que 127 bytes. H trs classes de saltos condicionais: - saltos sinalizados: dependem de um resultado na forma de um nmero sinalizado; - saltos no-sinalizados: dependem de um resultado na forma de um nmero no-sinalizado; - saltos de Flag simples: que dependem do status de algum dos Flags. A instruo JXXX no altera nenhum Flag.

Pgina 3 de 12

Cap6 Instrues de controle de fluxo.

Tipos de saltos condicionais Smbolo Descrio Condies ZF = 0 E SF = OF SF = OF SF OF ZF = 1 OU SF OF CF = 0 ZF = 0 CF = 0 CF = 1 OU E

Saltos sinalizados JG ou salto se maior do que OU JNLE salto se no menor do que ou igual a JGE ou salto se maior do que ou igual a OU JNL salto se no menor do que JL ou salto se menor do que OU JNGE salto se no maior do que ou igual a JLE ou salto se menor do que ou igual a OU JNG salto se no maior do que Saltos no-sinalizados JA ou salto se acima de JNBE salto se no abaixo de ou igual a JAE ou salto se acima de ou igual a JNB salto se no abaixo de JB ou salto se abaixo de JNAE salto se no acima de ou igual a JBE ou salto se abaixo de ou igual a JNA salto se no acima de OU OU OU

OU CF = 1 ZF = 1 ZF = 1 ZF = 0 CF = 1 CF = 0 OF = 1 OF = 0 SF = 1 SF = 0 PF = 1 PF = 0

Saltos de Flag simples JE ou salto se igual OU JZ salto se igual a zero JNE ou salto se no igual OU JNZ salto se no igual a zero JC salto se h VAI-UM (carry) JNC salto se no h VAI-UM (not carry) JO salto se h overflow JNO salto se no h overflow JS salto se o sinal negativo JNS salto se o sinal no-negativo (+) JP ou JPE salto se a paridade PAR (even) JNP ou JPO salto se a paridade IMPAR (odd)

Pgina 4 de 12

Cap6 Instrues de controle de fluxo.

6.3 Diferena entre Saltos sinalizados e no-sinalizados a) Trecho de programa que supe quantidades no-sinalizadas: ;supondo que AX contem 7FFFh e BX contem 8000h ... CMP AX,BX JA PT2 ;o salto no ocorre porque 7FFFh < 8000h ... ... PT2: MOV ... ;continuao do programa b) Trecho de programa que supe quantidades sinalizadas: ;supondo que AX contem 7FFFh e BX contem 8000h ... CMP AX,BX JG PT2 ;o salto ocorre porque 7FFFh (+) > 8000h (-) ... ... PT2: MOV ... ;continuao do programa Exemplo: Supondo que AX e BX contenham nmeros sinalizados, escreva um trecho de programa que coloque o maior deles em CX. ... MOV CX,AX CMP AX,BX JNL ABAIXO MOV CX,BX ABAIXO: ... ... ;AX j pressuposto ser o maior deles ;poderia ser tambm JGE ABAIXO ;caso BX seja de fato o maior deles ;continuao do programa

Pgina 5 de 12

Cap6 Instrues de controle de fluxo.

6.4 Salto incondicional JMP rtulo_de_destino

Rtulo_de_destino uma posio no programa, no mesmo segmento de cdigo onde JMP aparece No h restrio de faixa de endereamento como em JXXX JMP pode ajudar a solucionar o problema de faixa de endereamento das instrues JXXX

Exemplo: trecho utilizando JMP e JXXX TOPO: ... ;mais do que 126 bytes de instrues: limitao para JXXX ... ;corpo de algum lao ; DEC CX JNZ ABAIXO JMP CONTINUA JMP TOPO MOV ... ;programa continua ...

ABAIXO: CONTINUA:

Pgina 6 de 12

Cap6 Instrues de controle de fluxo.

6.5 Uma instruo de lao especial - LOOP. LOOP rtulo_de_destino

Tem como contador implcito o registrador CX, que deve ser inicializado antes do lao. Salta para rtulo_de_destino enquanto o contedo de CX no for zero. Quando CX = 0, a prxima instruo aps LOOP ser executada. CX decrementado automaticamente quando LOOP executada. Nenhum FLAG afetado. Exemplo de instrues vlidas: LOOP LOOP LOOP PT1 TOPO RETORNO

Obs: so equivalentes as seqncias MOV CX, (valor_inicial) ... ... LOOP TOPO MOV CX, (valor_inicial) ... ... DEC CX JNZ TOPO

TOPO:

TOPO:

Pgina 7 de 12

Cap6 Instrues de controle de fluxo.

6.6 Atividades prticas. 1) Escreva um programa que apresente uma '?', leia em seguida duas letras maisculas e exiba-as na prxima linha, em ordem alfabtica. 2) Modifique o programa de exibio de caracteres ASCII (pgina 1), de forma a exibir 16 caracteres por linha separados por espaos em branco. 3) Escreva um programa que pea ao usurio para teclar um dgito hexadecimal, exiba na prxima linha o seu valor decimal e pergunte ao usurio se deseja continuar a utilizar o programa: se for digitado S (sim), o programa se repete desde o comeo; se for digitado outro caracter, o programa termina. Teste se o dgito hexa est na faixa de valores correta. Se no estiver, exiba uma mensagem para o usurio tentar de novo. 4) Crie um trecho de cdigo modificando o programa do exerccio (3) acima, tal que se o usurio falhar em entrar com um dgito hexa na faixa correta mais do que trs tentativas, o programa exibe uma mensagem adequada e termina. 5) Crie um programa que implemente uma multiplicao por meio de somas sucessivas. Faa as consideraes que achar necessrias. 6) Crie um programa que implemente uma diviso por meio de subtraes sucessivas, exibindo o quociente e o resto com mensagens adequadas. Faa as consideraes que achar necessrias.

Pgina 8 de 12

Cap6 Instrues de controle de fluxo.

Apndice Algumas estruturas de linguagens de alto nvel 1) Estrutura IF - THEN - ELSE Em linguagem de alto nvel: IF (condio) THEN (seqncia 1) ELSE (seqncia 2) END_IF

Exemplo: Suponha que AL e BL contenham dois caracteres ASCII; exiba aquele que seja o primeiro em ordem alfabtica. Em linguagem de alto nvel: IF AL (menor ou igual a) BL THEN (exibir AL) ELSE (exibir BL) END_IF Em linguagem montadora: .... ;if AL menor ou igual a BL MOV AH,2h CMP AL,BL JA TROCA ;then MOV DL,AL INT 21h JMP FIM ;else TROCA: MOV DL, BL INT 21h ;end_if FIM: .....

Pgina 9 de 12

Cap6 Instrues de controle de fluxo.

2) FOR loop Em linguagem de alto nvel: FOR (nmero_de_vezes) (seqncia de instrues) END_FOR Exemplo: Exiba uma seqncia de 80 asteriscos no monitor de vdeo. Em linguagem de alto nvel: 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 ... Exerccio: modifique o programa que exibe todos os caracteres ASCII (pgina 1 deste captulo), utilizando apenas a instruo LOOP. DO

Pgina 10 de 12

Cap6 Instrues de controle de fluxo.

3) WHILE loop Em linguagem de alto nvel: WHILE (condio_verdadeira) DO

(seqncia de instrues) END_WHILE Exemplo: Ler caracteres ASCII do teclado, contando sua quantidade, at que o caracter Carriage Return (CR) aparea. Em linguagem de alto nvel: WHILE (caracter diferente de CR) DO (ler caracter do teclado e armazen-lo) (contador = contador +1) END_WHILE Em linguagem montadora: ... MOV DX,0h MOV AH,1h INT 21h ;while LOOP: CMP AL,0Dh JE FIM MOV (algum lugar), AL INC DX INT 21h JMP LOOP ;end_while FIM:

;inicializao do contador ;l o primeiro caracter em AL ; o caracter CR? ;salto quando caracter igual a CR ;salvando o caracter lido ;conta nmero de caracteres ;l o prximo caracter em AL ;fecha o lao WHILE

Pgina 11 de 12

Cap6 Instrues de controle de fluxo.

4) REPEAT loop Em linguagem de alto nvel: REPEAT (seqncia de instrues) UNTIL (condio_verdadeira)

Exemplo: Ler caracteres ASCII do teclado, contando sua quantidade, at que o caracter Carriage Return (CR) aparea. Em linguagem de alto nvel: REPEAT (ler caracter do teclado e armazen-lo) (contador = contador + 1) UNTIL (caracter igual a CR) Em linguagem montadora: ... MOV DX,0h MOV AH,1h ;repeat LOOP: INT 21h MOV (algum lugar),AL INC DX CMP AL,0Dh JNE LOOP ;until ...

;inicializao ;l um caracter em AL ;salvando o caracter lido ;conta nmero de caracteres ; o caracter CR? ;salto enquanto caracter no CR

Obs: O lao realizado ao menos uma vez; o caracter CR armazenado.

Pgina 12 de 12