Instrucoes Aritmeticas e Logicas

No capitulo anterior apresentaram-se as instruções elementares do mi­croprocessador Z80 que versavam, essencialmente, sobre a manipulação da informação do microprocessador para a memória, da memória para o microprocessador e dentro da própria CPU (transferência entre registos).

Esta informação, que até este momento se circulava de uns elemen­tos para outros do sistema, vai ser transformada e testada, em suma, vai ser processada pelo microprocessador. Um grupo de instruções que realiza estas tarefas são as instruções aritméticas e lógicas.

As instruções aritméticas e lógicas realizam operações muito simples sobre o acumulador e uma determinada fonte que, por exemplo, pode ser um dos registos de uso geral. Em quase todas elas o acumulador é uma das fontes e o destino da operação. As instruções que incremen­tam e decrementam registos representam a excepção a esta regra.

O resultado destas operações, como veremos a seguir, vai modificar

O registo de flags. Por exemplo, se numa operação de subtracção o resultado for zero a flag Z tomará o valor «1».

 

  

INSTRUÇÕES DE 8 BITS

ADD, Adição de Dois Registos

 Esta instrução é formada por um único byte. O conteúdo do registo especificado pelos últimos três bits do código de instrução é adicio­nado ao conteúdo do acumulador. O resultado da operação mantém-se no acumulador.

 

 

Vejamos alguns exemplos de adições.

Adicionar o conteúdo dos registos A e B, contendo A os valores 0AH, FFH, 0FH e B os valores 03H, 0l H e 0l H.

      

 

 

Neste exemplo, todas as flags com significado são colocadas a 0, o que é perfeitamente compreensível pela análise do resultado da operação. Não ha transporte do primeiro nibble para o segundo (H=0), não há transporte de byte (C =0), não  há overflow (P=0), o resultado é diferente de zero (Z¹0) e positivo (S=0). O significado da flag N sera abordado posteriormente.

      

 

 

 

A flag Z=1 revela que os oito bits do acumulador têm o valor 0 mas isto não significa por si só que o resultado da operação seja nulo. Com efeito, a flag do carry (C) é colocada a 1 indicando 0 transporte de I para outro byte mais significativo. Repare-se que a flag H (half carry) também é colocada a 1 pois existe um transporte do primeiro nibble para o segundo nibble.

A flag de zero é accionada (Z= 1) pois, de facto 1 o acumulador no final da operação contém apenas zeros.

Vejamos, finalmente, o ultimo exemplo, a adição dos valores hexadecimais 0FH e 01H.

 

Neste exemplo o único caso a assinalar é o transporte existente do primeiro nibble para o segundo nibble, o qual provoca a colocação da flag H a 1.

 

 

 

 

       ADD, Adição de Um Byte de Dados ao Acumulador

 

Esta instrução é formada por dois bytes. 0 primeiro byte representa 0 código do operação, 0 segundo byte contém a palavra de dados que só pretende adicionar ao conteúdo do acumulador:

 

Convém acentuar que o byte de dados é o byte que imediatamente se segue ao byte do código da instrução.

 

       ADD, Adição de Um Byte de Dados da Memória só Acumulador

As instruções que permitem adicionar um byte de dados na memória ao conteúdo do acumulador podem-se dividir em dois conjuntos1 con­soante o tipo de endereçamento da célula de memória.

O endereçamento pode ser indirecto ou indexado. No primeiro caso, par HL contém o endereço da posição de memória que contém a palavra de dados. No segundo caso, o endereço é obtido através da adição de um byte da instrução (o terceiro) ao conteúdo de um dos registos de (índice, IX ou IY.

 

       No modo indirecto temos uma instrução constituída por único byte. No modo indexado a instrução é formada por três bytes:

 

 

Estas três instruções de adição de bytes da memória com 0 conteúdo do acumulador vão provocar mudanças no registo de flags idênticas &S apresentadas para as instruções de adição anteriores. Alias, estas instruções diferem apenas no modo como 0 segundo operando (o pri­meiro esta no acumulador) é encontrado. Os exemplos apresentados continuam, obviamente, a ser verdadeiros no caso destas instruções.

Na tabela 13 estão representados Os códigos hexadecimais das instruções de adição sem transporte (ADD).

 

Tabela 13

ADC, Adição com Carry

A adição com carry (ADC) é formada por um grupo de cinco instruções equivalentes as cinco instruções de adição (ADD) apresentadas anteri­ormente. A adição com carry difere no facto de se adicionar 0 valor da flag de carry © ao resultado da adição do conteúdo do acumulador com 0 outro operando. Identicamente 0 resultado é colocado no acumulador:

Adição com carry ADC A, S (A ¬A + S + CY) em que

A  ≡ acumulador

S ≡  segundo operando

CY ≡  valor da flag de carry (C).

 

Os códigos binários das instruções de adição com transporte (add with carry) podem-se obter, facilmente1 a partir dos códigos das instruções de adição simples (ADD). Para isso basta substituir nos códigos anteriores Os três bits dentro de um rectângulo tracejado 0 0 0 pelos três bits 0 0 1. Obtém-se, assim, cinco instruções de adição com transporte correspondendo aos diversos modos de endereçamento do segundo operando, uma vez que 0 primeiro operando reside sempre no acumulador.

Por exemplo, a instrução de adição, com transporte, do acumulador com um byte de dados que segue imediatamente 0 código de instrução, tem a seguinte forma:

 

 

Este grupo de instruções afecta 0 byte de flags do mesmo modo que as instruções ADD.

Apresentam-se em seguida dois exemplos de adição com carry.

No primeiro exemplo, o acumulador tem o valor 0AH, o registo C tem o valor 65H e a flag de carry o valor 1.

 

O valor da flag de carry, C= 1, simula uma possível situação desta flag em resposta ao resultado de uma operação anterior.

registo de flags é actualizado segundo o resultado da operação ADC. Todas as flags são colocadas a zero (reset) com excepção da flag H que indica um transporte do primeiro nibble para o segundo nibble.

No segundo exemplo, o acumulador contam o numero hexadecimal F C H, o registo E contam o valor 04 H e a flag de carry o valor 0:

 

 

O valor da flag de carry, C=0, simula uma possível situação desta flag em resposta ao resultado de uma operação anterior.

valor final do acumulador é zero, logo, a flag de zero é colocada (set) a 1. Existe um transporte do primeiro nibble para o segundo, pelo que a flag H é colocada a 1. Finalmente, existe um transporte de byte que provoca a colocação da flag de carry a 1 (C= 1).

Na tabela 14 estão representados os códigos hexadecimais das instruções de adição com transporte (add with carry), ADC.

 

Tabela 14

 

 

SUB, subtracção de Um Operando ao Conteúdo do Acumulador

A instrução SUB subtrai ao conteúdo do acumulador um operando ar­mazenado num registo, numa posição de memória ou num byte da própria instrução.

Os códigos da instrução SUB podem-se obter a partir dos códigos da instrução ADD, tal como sucedia para a instrução ADC. Com efeito, basta substituir nos códigos da instrução ADD os três bits dentro do rectângulo tracejado 0 0 0 pelos três bits 0 1 0. Obtém-se, assim, cinco instruções de subtracção correspondentes aos diferentes tipos de endereçamento possíveis para o operando que se subtrai ao conteúdo do acumulador. Tal como nas instruções antecedentes, o resultado da operação é armazenado no acumulador: A¬A - S, em que A repre­senta o acumulador ee S o segundo operando.

Vejamos dois exemplos de subtracção do conteúdo do acumulador a partir de um operando armazenado no registo L.

 

 

A FLAG N com o valor 1 indica que a operação efectuada foi uma subtracção. O resultado das flags S, Z, PN e C é evidente.

 

O bit numero 7 do acumulador tem o valor 1 logo, a flag de sinal 6

activada. A flag C= 1 indica um transporte no ultimo bit (borrow). Re-

pare-se que, apesar deste transporte, a flag de overflow não foi activada. Como o último bit do acumulador contém o valor 1 o resultado tem de ser entendido na forma de complemento para dois. Então, calculando este complemento, obtemos o resultado correcto:

10 H-30 H=-20 H

Se considerarmos a subtracção 7FH - ADH, existem duas possibili­dades de interpretação do resultado armazenado no acumulador:

 

A-D2. Uma das hipóteses é considerar que AD representa um número negativo (em complemento para dois = -53 H) e o resultado será D2 H, ocorrendo necessariamente overflow [7F H-(-53H)=D2 H]. A outra hipótese é considerar que na diferença efectuada os números não têm sinal e 7FH - ADH = -2E H. o complemento para dois de 2E H é D2 H, tal como se obteve. Esta ultima hipótese é um pouco paradoxal uma vez que consideramos A partida números sem sinal para no fim obter­mos um resultado com sinal (-). As flags de interesse apresentam os seguintes valores: 5=1, Z=0, P/V=1, C= 1. PW = 1 assinala o overflow da primeira hipótese, enquanto C= 1 assinala a incongruência da se­gunda.

 

Tabela 15

 

SBC, Subtracção com Carry

 

A instrução SBC é idêntica á instrução SUB. A diferença reside no facto de se subtrair ao conteúdo do acumulador, além do byte subtractor, o valor do byte da flag de carry (C) . Mais uma vez o resultado da operação é colocado no acumulador:

Subtracção com carry - SBC A,S (A¬A - S - Cy) em que

A ≡ acumulador

S ≡  segundo operando

Cy  valor da flag de carry (C)

Os códigos hexadecimais das cinco operações SBC obtém-se por substituição nas instruções de ADD dos três bits dentro do rectângulo tracejado 0 0 0 pelos três bits 0 11 . As instruções SBC obtidas através desta substituição cobrem os diferentes modos de endereçamento do operando a subtrair ao acumulador: modo directo, modo in­directo, modo indexado (duas instruções) e modo imediato.

Apresentam-se em seguida dois exemplos de subtracção com carry em que são intervenientes o acumulador e um byte da própria instrução SBC (endereçamento imediato). No primeiro exemplo a flag de carry tem o valor 0, enquanto no segundo exemplo a flag tem o valor 1.

 

 

0 conteúdo do acumulador e do byte n foram considerados arbitrariamente.

 

0 registo de flags indica que o resultado é negativo, apresentando-se na forma de complemento para dois (S=11). A flag C indica que o diminuidor é superior ao diminuendo, daí resulta que o resultado da subtracção terá de ser, obviamente, negativo.

 

Para o segundo caso escolheu-se para conteúdo do acumulador o valor OB H e para o byte n OA H. Neste exemplo, antes de a operação SBC ser efectuada, a flag de carry tem o valor 1.

 

OPERAÇÃO A EFECTUAR: SBC A, n (A¬A-n-Cy)

 

CÓDIGO DE OPERAÇÃO: DEH, n

 

 

Neste exemplo o resultado final é nulo. Assim, a flag de zero é activada e toma o valor 1 . N=11 indica que a operação efectuada foi uma subtracção.

 

 

AND, Operação Lógica E entre o Conteúdo do Acumulador e Um Operando

 

A instrução AND efectua o produto lógico entre o conteúdo do acumulador e um segundo operando que se encontra armazenado num registo, numa célula de memória ou que faz parte do próprio código de instrução. Na figura 14a) encontra-se representada a tabela de verdade do operador lógico E.

 

 

 

Assim como sucedia para as instruções aritméticas anteriormente focadas, existem cinco instruções AND de acordo com os diferentes modos de endereçamento do segundo operando (no modo directo existem sete códigos correspondendo aos sete registos da CPU).

 

Os códigos destas instruções obtêm-se a partir dos códigos das instruções ADD substituindo os bits dentro do rectângulo tracejado 0 0 0 pelos três bits 1 0 0 .

As instruções AND afectam o byte de flags do seguinte modo:

 

 

 

↨-flag colocada consoante o resultado da operação

P - flag colocada consoante a paridade do resultado

0 - flag de reset

X - valor ignorado

 

Para este grupo de instruções as flags de maior importância são a flag S, a flag Z e a flag P. A flag S toma o valor 1 se o oitavo bit do acumulador, depois de efectuada a operação, tiver o valor 1. Se o resultado do E lógico for nulo, e o acumulador contiver apenas zeros, a flag Z tomará o valor 1. A fia9 P tomará o valor 1 se o resultado da operação for par, se for ímpar a flag terá o valor 0.

Vejamos dois exemplos da instrução AND entre o conteúdo do acumulador e o registo B. 0 acumulador contém o operando ACH nos dois exemplos, enquanto o registo B contém ACH no primeiro caso e 53 H no segundo caso.

 

OPERAÇÃO A EFECTUAR: AND A, B (A<--AAB)

CÓDIGO DE OPERAÇÃO: AO H

 

Note-se que a flag de sinal toma o valor 1 porque o bit 7 (oitavo) do resultado tem o valor 1. Por sua vez, a flag P é colocada em 1 devido à paridade par do resultado.

 

OPERAÇÃO A EFECTUAR: AND A, B (A<-AAB)

 CÓDIGO DE OPERAÇÃO: AO H

 

 

 

Um resultado nulo no acumulador provoca o set da flag de zero.

Na tabela 17 encontram-se representados os códigos hexadecimais das instruções AND.

 

       OR, Operação Lógica OU entre o Conteúdo do Acumulador e Um Operando

Na figura 14b) está representada a tabela de verdade do operador lógico OU.

Os códigos desta operação podem-se obter a partir dos códigos da instrução AM. Os três bits situados dentro do rectângulo 0 0 0 são substituídos pelos três bits 1 1 0 obtendo-se, assim, os códigos desejados correspondentes aos diversos modos de endereçamento.

As instruções OR afectam o byte de flags do mesmo modo que as instruções AND.

As flags de maior importância continuam a ser a flag S, indicadora de que o bit mais significativo do resultado é 1, a flag Z, indicadora de que o resultado da operação colocou todos os bits do acumulador a 0 e a flag P colocada a 1 se o resultado da operação tiver paridade par.

Apresenta-se a seguir um exemplo da operação lógica OU entre os conteúdos dos registos A e L:

OPERAÇÃO A EFECTUAR: OR A,1---(A<--AVL)

CÓDIGO DE OPERAÇÃO: B5 H

Repare-se no valor da flag P indicando paridade ímpar. Com efeito, o número de uns existentes no resultado é igual a cinco.

Na tabela 18 estão representados os códigos hexadecimais das instruções OR.

 

XOR, Operação Lógica OU EXCLUSIVO entre o Conteúdo do Acumulador e Um Operando

 

Na figura 14c) encontra-se representada a tabela de verdade do operador lógico OU EXCLUSIVO.

Os códigos das instruções XOR podem-se obter, novamente, a partir dos códigos das instruções AM. De novo os três bits dentro do rectângulo tracejado 0 0 0 devem ser substituídos pelos bits 1 0 1 .

A instrução XOR, quando aplicada sobre o próprio acumulador, é um dos processos de colocar este registo só com zeros. Analisemos este exemplo.

 

OPERAÇÃO A EFECTUAR: XOR A,A (A<--AG)A)

CÓDIGO DE OPERAÇÃO: AFI-1

 

 

A flag de zero é accionada pois todos os bits do acumulador são colocados a 0. Notar também que um resultado nulo apresenta paridade par. 0 byte de flags nesta instrução é afectado de um modo semelhante ao das instruções AND e OR.

Representam-se na tabela 19 os códigos hexadecimais das instruções XOR.

 

 

 

 

 

 

CP, Compara Um Operando com o Conteúdo do Acumulador

 

A instrução CP efectua a subtracção de um operando ao conteúdo do acumulador. Ao contrário da instrução SUB (ou SBC), a instrução CP não altera o conteúdo do acumulador, servindo este apenas como fonte. 0 operando subtractor pode-se encontrar num registo, modo de endereçamento directo, numa célula de memória, modo indirecto e indexado, ou pode-se ainda encontrar no próprio código da instrução CP, modo de endereçamento imediato.

0 resultado da operação é obtido através da consulta do byte de flags:

 

A>S→Z=0 e Cy= 0

A=S→Z=1 e Cy=O

A<S→Z=0 e Cy= 1

 

em que A representa o conteúdo do acumulador, S o operando a comparar, Z e Cy as flags de zero e carry, respectivamente.

Mais uma vez os códigos das instruções CP obtêm-se a partir dos códigos das instruções ADD, substituindo os três bits 000 pelos bits 1 1 1 .

Vejamos um exemplo de aplicação da instrução CP em que o acumulador contém o valor 1 F H e a célula de memória 1900 H o valor 18 H.

 

Trata-se de uma operação em que o modo de endereçamento, do operando a comparar com o conteúdo do acumulador, é indirecto. Então, o par de registos HL, deve conter o endereço da posição de memória, 1900 H.

 

OPERAÇÃO A EFECTUAR: CP A, (HL) (A-(HL)

CÓDIGO DE OPERAÇÃO: BE H

 

 

Z=O e Cy=O→ A>S

 

As flags não abordadas, com excepção da flag N, que é sempre igual a 1, também são afectadas pelo resultado da operação de comparação. No entanto, estas flags não são determinantes para averiguar a relação de grandeza entre os dois operandos.

Na tabela 20 encontram-se os códigos hexadecimais das instruções CP.

 

 

INC, Incrementação de Um- Registo ou de Urna Posição de Memória

 

Esta instrução, ao contrário das anteriores, não utiliza o acumulador como fonte e resultado de todas as operações. Apenas o registo seleccionado (no qual se inclui o acumulador) ou a posição de memória endereçada são incrementados de uma unidade.

Em qualquer dos casos o byte de flags é afectado do seguinte modo:

 

 

↨ - flag afectada consoante o resultado da operação;

X - flag desconhecida;

V - flag indicadora de overflow (=1);

0 - flag de reset;

o - flag não afectada.

Analisemos uma por uma as instruções INC.

1 - INC r, incremento de um registo de uso geral.

Esta instrução é formada por um único byte e permite o incremento de um dos sete registos de uso geral, incluindo o acumulador: A, B, C, D, E, H e L.

0 código de operação é o seguinte:

Vejamos dois exemplos da instrução INC. No primeiro o registo B contém o valor hexadecimal FF H. No segundo o registo H contém o valor 7F H.

 

OPERAÇÃO A EFECTUAR: INC B (B<B+1)

CÓDIGO DE OPERAÇÃO: 04 H

 

A flag de zero é accionada, pois o resultado da operação coloca todos os bits do registo a 0. Repare-se que para esta instrução a flag de carry não altera o seu valor (●).

 

OPERAÇÃO A EFECTUAR: INC H (H<-H+1)

CÓDIGO DE OPERAÇÃO: 24 H

 

 

A FLAG S é colocada em 1 porque o bit nº 7 tem o valor 1. Por sua vez, a flag de overflow é accionada, visto que houve um transporte do bit nº 6 para o bit nº 7. Este bit antes da operação tinha o valor 0. Foi a mudança para 1 que fez a flag P/V tomar o valor 1.

Na tabela 21 apresentam-se os códigos das instruções de incremento de registos (INC r).

 

 

 

2 - INC (HL): incremento de uma posição dee memória (modo indirecto).

 

A instrução (HL) é formada por um único byte e realiza o incremento de uma célula de memória cujo endereço se encontra no par HL. Obviamente, a célula de memória diz respeito à memória RAM. 0 código de instrução tem a seguinte configuração:

 

 

Incremente-se a posição de memória 1910 H que contém o valor hexadecimal AO H:

 

OPERAÇÃO A EFECTUAR: INC (HL)  ((HL)<-(HL)+1)

CÓDIGO DA OPERAÇÃO: 34 H

REGISTO HL: 1910 H

 

 

 

0 registo de flags é afectado da mesma forma que na instrução de incremento de registos (INC r).

 

3 - INC (Ix+d), INC (Iy+d): incremento de uma posição de memória

       (modo indexado)

 

São duas as instruções INC que utilizam o modo de endereçamento inclexado de uma célula de memória. Estas duas instruções correspondem aos dois registos de índice, IX e IY, existentes no microprocessador Z80.

Estas instruções são constituídas por três bytes, armazenando o terceiro byte o valor d, que se deve adicionar a um dos registos de índice a fim de se obter o endereço da célula de memória que se pretende incrementar.

Por exemplo, suponhamos que queremos incrementar a célula de memória cujo endereço é 1905 H, o registo IX contém o valor 1900 H e o valor de d será, naturalmente, 05 H. Arbitrariamente, escolhe-se para conteúdo da célula 1905 H o valor FF H:

 

OPERAÇÃO A EFECTUAR: INC (IX+d) ((IX+d)<-(IX+d)+1)

CODIGO DA OPERAÇÃO: DD H, 34 H, 05 H.

REGISTO IX: 1900 H

Como se pode verificar, o registo de flags foi modificado do mesmo modo que para as instruções INC r. A flag Z toma o valor «1» porque a célula de memória no fim da operação ficou inteiramente preenchida com zeros.

 

DEC: Decrementação de Um Registo ou de Uma Posição de Memória

 As instruções DEC são formalmente idênticas às instruções INC. Decrementam os sete registos da CPU (A, B, C, D, E, H e L) e permitem a decrementação de uma célula de memória RAM. Esta célula, tal como sucedia nas instruções INC, pode ser endereçada por intermédio do par de registos HL ou por via dos registos de índice IX e IY. Neste último caso é necessário especificar um valor d que o microprocessador adiciona a um dos registos de índice, constituindo o resultado final o endereço da posição de memória.

Os códigos binários das instruções DEC obtêm-se a partir dos códigos das instruções INC. Para isso basta substituir nos códigos das instruções INC os três bits dentro de um rectângulo tracejado 1 0 0 pelos três bits.

Na tabela 22 encontram-se representados os códigos hexadecimais das instruções DEC.

Como exemplo, decremente-se o registo A que contém, previamente, o valor 00 H. 0 resultado será negativo e igual a -01 H.

 

OPERAÇÃO A EFECTUAR: DEC A (A<--A-1)

CÓDIGO DE OPERAÇÃO: 3D H

 Sendo o resultado negativo (-01) virá em notação de complemento para dois. É pois necessário complementá-lo novamente para dois de modo a obtermos o verdadeiro valor do byte resultante. 0 oitavo bit do registo A colocado a “1”  é indicador de que o resultado é negativo, ao mesmo tempo que a flag de sinal é colocada igualmente a “1” (número negativo). A flag N com o valor “1” indica apenas que a operação efectuada foi uma subtracção (subtracção de uma unidade a um registo).

 INSTRUÇÕES ARITMÉTICAS DE 16 BITS

As instruções aritméticas que temos vindo a abordar realizam operações com registos de oito bits ou com posições de memória também de oito bits. o microprocessador Z80 também permite a efectivação de operações aritméticas com 16 bits, isto é, os registos directamente envolvidos nestas operações são registos de 16 bits (IX, IY e SP) ou pares de registos de 8 bits (BC, DE, HL).Evidentemente que para estas operações o destino do resultado já não é o acumulador (registo de 8 bits) mas sim os registos IX, IY ou o par HL.

1) ADD: adição de dois pares de registos

São três as instruções de ADD em conformidade com os três destinos que o resultado da operação pode ter, par HL, registo IX e IY:

 

 

0 registo de flags não é afectado do mesmo modo que no caso das instruções de 8 bits. Apenas duas flags são afectadas: a flag N que é sempre colocada a 0 (reset) e a flag C colocada de acordo com o resultado da operação. Sempre que há um transporte do byte de maior ordem (2º byte) para um hipotético terceiro byte a flag de carry é colocada com o valor 1.

Como exemplo, adicione-se ao par HL que contém o valor FFFC H, o conteúdo do par BC, 0004 H.

OPERAÇÃO A EFECTUAR: ADD HL, BC        (HL<--HL+BC)

 

0 único bit com significado do registo de flag é o correspondente à flag de carry. Neste exemplo, devido ao transporte do bit mais significativo (oitavo bit do segundo byte), a flag de transporte é colocada no nível 1.

Na tabela 23 encontram-se representados os códigos hexadecimais das instruções ADD de 16 bits.

2) ADC: adição com carry de dois pares de registos

A instrução ADC tem apenas um par de registos como destino da operação: o par HL. É uma instrução de dois bytes, contendo o último byte a indicação do par de registos (BC, DE, HL, SP) que é adicionado ao par HL e à flag de carry

 

 

 

A flag de sinal S toma o valor 1 sempre que exista um bit com o valor 1 na posição mais significativa do resultado, isto é, o bit número 15 (ver fig. 15). A flag Z apresenta o valor 1 se o resultado da operação preencher os 16 bits do par HL totalmente com zeros. Quanto à flag de overflow, V será igual 1 se houver uma transição de "0" para 1 do bit número 15 do par de registos HL depois de efectuada a operação. A flag N terá invariavelmente o valor "0", enquanto que a flag de carry será colocada a 1 sempre que houver um transporte do bit 15 para um terceiro hipotético byte.

Na figura 15 estão assinalados alguns exemplos de como as flags são afectadas por esta instrução. À excepção da flag H a filosofia de activação das restantes flags é a mesma que para a adição com carry de oito bits.

 

Na tabela 23 encontram-se representados os códigos das instruções ADC de 16 bits.

 

3) SBC: Subtracção com carry de dois pares de registos A instrução S13C subtrai ao par HIL o conteúdo de um par de registos (BC, DE, HL, SP) e o valor da flag de carry. É uma instrução de dois bytes, formalmente idêntica à instrução ADC de 16 bits, e em que o segundo byte determina o par de registos (ou registo SP) subtractor:

 

 

Para esta instrução os bits do registo de flags são modificados do seguinte modo:

 

 

As flags com significado para esta operação (S, Z, V, N e C) seguem os princípios já enunciados a propósito da instrução SBC de oito bits. A diferença reside no facto de ser o bit número 15, do par HL, o mais significativo e, portanto, o definidor do sinal do número binário. A flag C é colocada a 1 se o valor absoluto do par subtractor mais o valor da flag C, anterior à operação, for maior do que o valor absoluto do par HL.

Na tabela 23 encontram-se representados os códigos hexadecimais das instruções SBC.

 

4) INC. incremento de um par de registos ou de um registo de 16 bits Existem dois tipos de instrução INC de 16 bits consoante se pretenda incrementar um par de registos ou um registo de índice de dezasseis bits. No primeiro caso o código de instrução é formado por um único byte, para no segundo ser constituído por dois bytes.

As instruções INC de 16 bits, ao contrário das de oito bits, não afectam qualquer dos bits do registo de flag.

Os códigos binários destas instruções são os seguintes:

 

Na tabela 23 encontra-se um resumo dos códigos das instruções DEC.

 5) DEC: decremento de um par de registos ou de um registo de 16 bits.

As instruções DEC de 16 bits são formalmente idênticas às instruções INC. Existem dois tipos de instrução consoante se pretenda decrementar um par de registos (instrução de um byte) ou um registo de índice (instrução de dois bytes).

Ao contrário das instruções DEC de oito bits, as instruções DEC de 16 bits não afectam o registo de flags.

Os códigos binários destas instruções são os seguintes:

 

 

 

 

Na tabela 23 encontra-se um resumo dos códigos das instruções INC.

<-- Voltar

Hosted by www.Geocities.ws

1