Instrucoes Especiais

Do conjunto de instruções do microprocessador Z80 fazem parte cinco instruções que actuam exclusivamente sobre o conteúdo do acumulador e sobre a flag de carry, CY.

 

DAA: Decimal Adjust Accumulator

 Quando se pretende realizar adições ou subtracções com números codificados em BCD (Binary Coded Decimal) é natural obterem-se resultados inválidos visto que o acumulador realiza as operações em binário, isto é, na forma em que os dígitos foram introduzidos.

 Para ilustrar este facto, a adição de 4(10) a 99(10) dá como resultado o número 103(10). A representação em BCD de 99(10) é 1001 1001 e a de 4(10) o) é 0100. Então.

 

 Como se pode confirmar, o resultado obtido não é válido para uma representação em BCD uma vez que 1101 não faz parte do código BCD. Sabemos que o resultado deve ter 12 bits de comprimento (103(10)=00011 0000 0011 BCD).

 

A instrução DAA desenvolve um conjunto de acções de modo a dar ao resultado no acumulador uma codificação em BCD:

  a) se o valor dos quatro bits menos significativos do acumulador é maior do que nove (9), ou se a flag H é colocada em «1» adiciona-se seis (6) ao conteúdo do acumulador;

  b) se o valor dos quatro bits mais significativos do acumulador é maior do que nove (9), ou se a flag C tem o valor «1» adiciona-se seis (6) aos quatro bits mais significativos.

 No exemplo em estudo a instrução DAA efectua as seguintes operações:

 Conteúdo final do registo de flags:

  A flag C=1 indica o transporte para um terceiro conjunto de quatro bits, única maneira de codificar 103(10) em BCD (0001 0000 0011).

A instrução DAA é composta por um único byte e actua exclusivamente sobre o acumulador. Tem o seguinte código de instrução:

 

 0 registo de flags é alterado pela instrução DAA da seguinte forma:

 

 

↕ - flag alterada de acordo com o resultado da operação;

P - flag colocada a 1 se a paridade for par;

● - flag não afectada;

X - valor desconhecido.

 

 CPL: Complementação do Acumulador (A)

 

Esta instrução executa a complementação para um do conteúdo do acumulador. Todos os bits com o valor 1 passam a ter o valor 0 e todos os bits a 0 mudam para 1:

 As flags H e N são colocadas a 1, as outras não são alteradas.

 

 NEG: Complementação para Dois do Acumulador (A)

 

Esta instrução executa a complementação para dois do conteúdo do acumulador. Depois de se complementar (para 1) o conteúdo do acumulador, a complementação para dois obtém-se adicionando 1 ao resultado.

A instrução NEG é composta por dois bytes:

 

0 registo de flags é modificado do seguinte modo:

 

 A flag V tomará o valor «1 » no caso de o conteúdo do acumulador ser 80 H antes da complementação para dois. Exemplifiquemos calculando o complemento para dois de 80 H.

 

 

 

Seja, por exemplo, a subtracção do byte 54 H ao conteúdo do acumulador que é 40 H. Uma vez que o byte subtractor é maior do que o conteúdo do acumulador o resultado virá negativo e em complemento para dois. Para obter o resultado numa forma inteligível efectua-se de seguida uma complementação para dois:

 

Programa a efectuar:

SUB A, 54 H; subtrai 54 H ao conteúdo do acumulador

NEG ● ; complementa para dois o resultado

 

Memória de programa:

  

O resultado obtido depois da subtracção em binário é:

1 1 1 0 1 1 0 0 - EC H

 O 1 no oitavo bit é sinónimo de que o resultado é negativo. Por isso, depois da instrução NEG o valor hexadecimal 14 H tem de ser entendido como um resultado negativo.

  

CCF: Complement Carry Flag

 

Esta instrução complementa a flag de carry, isto é, se o seu valor for 0 colocará a flag C igual a 1; se o valor de C for 1 então será colocada a 0. 0 código binário desta instrução é o seguinte:

  As alterações no registo de flags dão-se na flag de carry principal visada da instrução CCF, e na flag N, que é colocada a «0».

  

 SCF: Set Carry Flag

 A instrução SFC coloca a flag C com o valor «1» qualquer que seja o valor anterior desta flag.

A instrução SCF tem o seguinte código binário: 

No registo de flags C é colocada a , 1 », N e H recebem o valor «0» Todas as outras flags se mantêm inalteradas.

Não existe uma instrução expressamente para colocar a flag de carry a «0» (reset), visto que esta operação é possível a partir da operação AND do acumulador consigo próprio. Com esta operação o acumulador mantém o seu valor (A AND A=A), as flags S, Z, H e P conservam igualmente o seu valor primitivo. A flag N é colocada a «0» indicando que a última operação executada não foi uma subtracção (indicação para a instrução DAA), e, finalmente, a flag C é colocada a «0» como se desejava.

<-- Voltar

Hosted by www.Geocities.ws

1