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

Flags e saltos condicionais

Sab

20

Jun

2009


19:05

(7 votos, média 5.00 de 5) 


O (flag de overflow)

Overflow significa transbordar, inundar. No "computês" do Brasil costuma-se dizer "estourar". Para entender a flag de overflow é preciso que fique bem claro o que são números com sinal. A flag de overflow é usada para indicar um estouro quando números com sinal são usados. A flag de carry não pode ser usada para este fim. Um simples exemplo é suficiente para provar:

MOV AL,0FEh ; põe 254 decimal (sem sinal) ou -2 (com sinal) em al ADD AL,4h ; adiciona 4. al agora está com 2h

Neste caso a flag de carry será setada por que o resultado sem sinal 258 ultrapassa o limite de 255 que corresponde ao tamanho do dado. Porém, se este for um cálculo com sinal, não haverá estouro: -2 + 4 = 2, al contém o resultado correto de 2 e a flag de overflow permanece zerada.

Um outro exemplo onde há um overflow num cálculo com sinal:

MOV AL,7Fh ; põe 127 decimal em al ADD AL,4h ; adiciona 4. al agora está com 83h

Neste outro caso a flag de carry está zerada por que o resultado sem sinal 131 está dentro do limite de 255 do tamanho do dado. Porém, em relação ao cálculo com sinal, houve um estouro por que, se al contém 83h, este é o número decimal com sinal -125, um resultado errado. O resultado correto 131 fica fora dos limites -127 a +128 dos números com sinal de 8 bits.

Neste tipo de operação aritmética o processador seta a flag de overflow se o bit de sinal muda sem que tenha havido um "carry". Observe como isto ocorre independente da flag de carry:

MOV AL,7Fh ; põe 127 decimal em al INC AL ; causa overflow (carry não é afetada por INC) ; MOV AL,80h ; põe -128 decimal em al DEC AL ; causa overflow (carry não é afetada por DEC)

Nas instruções de deslocamento (shift), apenas nas operações de um único shift pode-se esperar que a flag de overflow dê uma indicação válida se um resultado com sinal for muito grande para o tamanho do dado. Por exemplo:

MOV AL,80h ; põe -128 em al SHL AL,1 ; multiplicar por 2 causa overflow MOV AL,0FEh ; põe -2 em al SHL AL,1 ; multiplicar por 2 resulta em -4 sem overflow MOV AL,80h ; põe -128 em al SHL AL,2 ; multiplica por 4 sem indicação de overflow MOV AL,0FEh ; põe -2 em al SAR AL,1 ; divisão por 2 resulta em -1 sem overflow

SAR é uma instrução especial de deslocamento com sinal à direita que mantém o sinal correto no resultado. Ela consegue fazer isto deslocando todos os bits, exceto o bit mais alto. Como um shift SAR único na realidade é uma divisão por +2, nunca poderá ocorrer um overflow. Já a instrução SHL pode e, em operações de um shift único, a flag de overflow será devidamente setada. Para isto, o processador faz um teste para ver se o bit de sinal é o mesmo que a flag de carry, zerando a flag de overflow se seus valores forem idênticos. Devido a este teste é possível estabelecer um outro uso para a flag de overflow (estes testes mudam o conteúdo do registrador):

SHL AL,1 JNO >L1 ; salte se os dois bits mais altos de al forem iguais SHL AL,1 JO >L1 ; salte se os dois bits mais altos de al forem diferentes SHL EAX,1 JNO >L1 ; salte se os dois bits mais altos de ax forem iguais SHL EAX,1 JO >L1 ; salte se os dois bits mais altos de eax forem diferentes

Instruções de rotação funcionam do mesmo modo que as de deslocamento. Como a instrução ROR desloca todos os bits para a direita substituindo o bit mais alto pelo mais baixo, isto possibilita comparar o bit mais alto com o bit mais baixo de dados. Por exemplo (estes testes mudam o conteúdo do registrador):

ROR AL,1 JNO >L1 ; salte se o bit mais alto e o mais baixo de al forem iguais ROR AL,1 JO >L1 ; salte se o bit mais alto e o mais baixo de al forem diferentes ROR EAX,1 JNO >L1 ; salte se o bit mais alto e o mais baixo de eax forem iguais ROR EAX,1 JO >L1 ; salte se o bit mais alto e o mais baixo de eax forem diferentes

A instrução especial de multiplicação com sinal IMUL seta a flag de overflow se o resultado com sinal for maior que o tamanho do dado.

A flag de overflow é usada principalmente com as instruções de salto condicional JO e JNO, por exemplo:

JO >L10 ; salte para L10 se a flag de overflow estiver setada JNO L1 ; salte para L1 se a flag de overflow estiver zerada

P (flag de paridade)

A flag de paridade indica se existe um número par ou ímpar de bits setados no dado. Ela estará setada se o número de bits setados for par e zerada se o número for ímpar. Na comunicação serial, o bit de paridade é usado como um checador de erros pouco sofisticado. Após cada byte enviado, o transmissor envia um bit de paridade que indica ao receptor se o byte que acabou de ser enviado deveria ter um número par ou ímpar de bits setados. Este sistema pode deixar escapar um byte corrompido, mas geralmente detecta uma série de bytes corrompidos. Quando usado desta forma, um byte pode ter menos do que 8 bits: transmissões seriais geralmente usam bytes de 7 bits mais um bit de paridade.

A flag de paridade geralmente é usada com as instruções de salto condicional JP e JNP, por exemplo:

JP >L10 ; salte para L10 se a flag de paridade estiver setada JNP L1 ; salte para L1 se a flag de paridade estiver zeradaкомпромат Вадим Логофет посуда для русской печиооо отзывы полигон отзывы topodinресторан nikas отзывы сегодня харьков погодаадреса никас

Informações adicionais