Flags

Cada um dos dois registos de flags do microprocessador Z80 contém seis bits de informação que são colocados a «0» ou a «1», pelas várias instruções que a CPU executa. Quatro destes bits podem-se testar de modo a serem utilizados como condição para a execução de instruções de JUMP (salto condicional), CALL (chamada de sub-rotinas) ou RETURN (retorno de sub-rotinas). Por exemplo, um salto no programa (JUMP) pode unicamente ser desejado se um determinado bit do registo de flags tiver o valor «1 ».

Os quatro bits do registo de flags que se podem testar são:

 

1) Carry Flag (C) - Esta flag representa o transporte do bit de maior ordem do acumulador. Por exemplo, a flag de carry será colocada a 1 durante uma instrução de adição se for gerado um transporte do oitavo bit do acumulador.

A flag C também será iguala 1 se durante uma subtracção o diminuidor for superior ao diminuendo.

 

2) Zero Flag (Z - Esta flag é colocada a 1 sempre que o resultado de uma operação preenche inteiramente com zeros o acumulador. De outro modo terá o valor 0 .

 

3) Sign Flag (S) - Esta flag é utilizada sempre que se opere com números com sinal e é colocada a 1 se o resultado da operação for negativo. Uma vez que o bit 7 (MSB) representa o sinal do número (um número negativo terá um 1 no bit 7), esta flag contém o estado do bit 7 do acumulador.

 

4) Parity/0verflow Flag (P/V) - Esta flag, com duplo significado, indica a paridade do resultado no acumulador quando são efectuadas operações lógicas (por exemplo: AND A,B) e assinala overflow quando se executam operações aritméticas entre números com sinal e, por isso, em complemento para dois.

 

A flag de overflow do microprocessador Z80 indica um erro quando um número em complemento para dois, no acumulador, excede o máximo possível (+127) ou é menor do que o mínimo permitido (-128) pela representação em complemento para dois. Por exemplo considere-se a adição:

 

 A flag C é igual a 0 e a flag P/V é colocada a 1 indicando a ocorrência de overflow. Repare-se que se não estivéssemos a utilizar a notação em complemento para dois (bit 7 para o sinal) o resultado estaria correcto. Isto só é possível quando se opera exclusivamente com números positivos.

Considere-se agora a adição de dois números negativos:

  Atente-se que o resultado é correcto embora a flag C tenha o valor1. Esta flag não pode ser utilizada como indicador de overflow. Para este caso a flag P/V terá o valor 0.

Durante as operações lógicas AND, OR e XOR esta flag é colocada a 1 se a paridade do resultado for par, sendo colocada a 0 se for ímpar.

Quando se efectuam operações de subtracção os resultados têm de ser interpretados com base nas flags de sinal (S), de overflow (P/V e de carry (C).

Vamos apresentar alguns exemplos de subtracções e respectivas flags.

 

Subtracções de Dígitos com Sinal

 

Neste caso os números são entendidos na forma de complemento para dois, estando limitados à gama +127, -128.

 0 diminuendo é superior ao diminuidor pelo que C = 0, o resultado é positivo, S = 0, e encontra-se dentro da gama +127, -128.

   

 0 diminuendo é inferior ao diminuidor (existência de borrow), o que implica C = 1. S = 1 indica um resultado negativo em complemento para dois o que está de acordo com C = 1. Mais uma vez o resultado está dentro da gama +127, -128 (-128(10) = FF em complemento para dois).

 

 

S = 1 porque o bit nº 7 do resultado é «1 ». No entanto não se pode concluir que o resultado é um número negativo, em complemento para dois, porque a flag de overflow foi activada a P/V = 1. A flag C toma o valor «1 » pois, de facto, o diminuidor é superior ao diminuendo. Na realidade o valor introduzido no computador para diminuidor é o complemento para dois de OA H : F6 H. Então, a operação realmente efectuada pelo microcomputador é:

       78 H - F6 H = 82 H    (F6 H>78 H)

   Subtracções de Dígitos sem Sinal

 

Neste caso os números são entendidos sem sinal, podendo utilizar os oito bits do acumulador. A gama neste caso é de 0 a 255.

 

 

S = 1 indica que o bit 7 do resultado é «1», no entanto não indica um resultado negativo. Não existe overflow, visto não estarmos a operar em complemento para dois e, finalmente, C = 0 porque o diminuendo é superior ao diminuidor.

 

 A flag S indica um resultado positivo porque o bit n.o 7 do resultado tem o valor «0». No entanto, este resultado tem de ser entendido na forma de complemento para dois uma vez que a flag C toma o valor «1 ». Isto significa que o resultado terá de ser negativo pois o diminuendo é inferior ao diminuidor. Este caso é, no entanto, uma situação pouco clara, pois considerámos operações de números sem sinal e obtivemos um resultado negativo. Tanto quanto possível é preferível evitar situações desta natureza, isto é, deve-se definir o mesmo tipo de números para os operandos e para os resultados.

Estes exemplos demonstraram a necessidade de se entender um resultado à luz das três flags principais (mais a flag 2) e não apenas baseado numa delas.

 Existem também dois bits no registo de flags que não podem ser testados. Estas flags são utilizadas pela CPU quando se efectuam operações aritméticas em BCD.

 1) Half Carry (H). Esta flag indica um transporte dos primeiros quatro bits para os seguintes. Quando se usa a instrução DAA (Decimal Adjust Accumulator) esta flag é utilizada na correcção de resultados de adições ou subtracções em que se utilizou uma forma compactada (em BCD) para os operandos.

      2) Subtract Flag (N). Uma vez que o algoritmo de correcção de operações em BCD é diferente se se tratar de uma adição ou de uma subtracção, esta flag é utilizada para especificar qual o tipo da instrução efectuada em último lugar, de modo a permitir a correcta execução da instrução DAA.

 

<-- Voltar

Hosted by www.Geocities.ws

1