A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Cap. IV - Condições e Loops

Dom

16

Dez

2007


14:03

(5 votos, média 5.00 de 5) 


Também podemos fazer comparações utilizando instruções:

CMP (compara) DESTINO FONTE

Destino - podem ser variáveis e registradores de 8, 16, 32 bits. Fonte - podem ser variáveis, registradores e valores inteiros.

Esta instrução compara os dois operandos e, por sua vez, modifica as bandeiras AF, CF, OF, PF, SF, ZF do microprocessador.

jxx (salta) ETIQUETA

Esta instrução salta até um endereço. Vejamos a tabela de alguns saltos e seus significados:

InstruçãoDescriçãoEstado das bandeiras
JAsaltar se estiver acimaCF=0 e ZF=0
JAEsaltar se estiver acima ou for igualCF=0
JBsaltar se estiver abaixoCF=1
JBEsaltar se estiver abaixo ou for igualCF=1 ou ZF=1
JEsaltar se for igualZF=1
JGsaltar se for maiorZF=0 ou SF = OF
JGEsaltar se for maior ou igualSF = OF
JLsaltar se for menorSF != OF
JLEsaltar se for menor ou igualZF=1 ou SF != OF
JMPsaltar diretamente-
JNAsaltar se não estiver acimaCF=1 ou ZF=1
JNAEsaltar se não estiver acima ou for igualCF=1
JNBsaltar se não estiver abaixoCF=0
JNBEsaltar se não estiver abaixo ou for igualCF=0 e ZF=0
JNEsaltar se não for igualZF=0
JNGsaltar se não for maiorZF=1 ou SF != OF
JNGEsaltar se não for maior ou igualSF != OF
JNLsaltar se não for menorSF = OF
JNLEsaltar se não for menor ou igualZF=0 e SF = OF

Pergunta: Para que serve o estado da bandeira ou Flag? Cada instrução e salto é executada se uma determinada condição for cumprida. Por exemplo:

JA será executado quando a bandeira CF for igual a 0 e ZF também for igual a zero.

JBE será executado quando a bandeira CF for igual a 1 ou ZF for igual a 1.

Reparem que JMP não tem condição. Isto significa que essa instrução não precisa de nenhuma condição para ser executada.

É por isso que a instrução CMP modifica essas bandeiras, é para que o salto colocado na linha seguinte possa ser executado.

Então vamos analisar o prog006, onde encontraremos o seguinte:

.code prog006: invoke MessageBox ....... cmp eax, IDYES ; Compara EAX com a constante IDYES jne Fim ; Salta para Fim se não forem iguais. invoke MessageBox,NULL,addr MsgIDYES,addr MsgTitulo,MB_OK Fim: invoke ExitProcess,0 end prog006

Primeiro utilizamos CMP para comparar EAX com a constante IDYES. Se não forem iguais, saltará para a etiqueta Fim; se coincidir, mostrará a mensagem.

Este exercício seria o mesmo que o prog005. A diferença é que não utilizamos o bloqueio .if. Façamos o mesmo com o prog005b usando instruções:

.code prog006a: invoke MessageBox,....... cmp eax, IDYES ; Compara EAX com a constante IDYES jne _ElseIF ; Salta para _ElseIF se não forem iguais. invoke MessageBox,NULL,addr MsgIDYES,addr MsgTitulo,MB_OK _ElseIF: cmp eax,IDNO ;Compara EAX com a constante IDNO jne Fim ; Salta para Fim se não forem iguais. invoke MessageBox,NULL,addr MsgIDNO,addr MsgTitulo,MB_OK Fim: invoke ExitProcess,0 end prog006a

Para fazer comparações com instruções, devemos saber cada significado dos saltos.

Agora utilizaremos as bibliotecas rvlcnrand.lib para gerar um valor aleatório e a biblioteca masm.lib, porque será usada a função dwtoa para mostrar o resultado.

.code prog006b: invoke randzime invoke urange,1,15 cmp eax,5 ; Compara EAX com 5 jg Maior ; Salta se for Maior invoke MessageBox... jmp Fim ; salta diretamente Maior: cmp eax,10 ; Compara EAX com 10 jl Menor ; Salta se for menor invoke MessageBox........ jmp Fim ; salta diretamente Menor: invoke dwtoa,eax,addr Cmp_03 invoke MessageBox,...... Fim: invoke ExitProcess,0 end prog006b

Quando a mensagem será mostrada?

A mensagem será mostrada quando EAX for menor que 5

A mensagem será mostrada quando EAX for maior que 10

O valor será mostrado quando nenhuma condição for cumprida.

Informações adicionais