ZX-BATTLE
CURSO DE PROGRAMAÇÃO
BASIC
C++
PASCAL
 
 
 
OUTROS
Envie-nos as suas duvidas ou questões!
 
 
 
LINKS
 
Inicio Curso
Inicio Site
 
 
 
 

PROGRAMAÇÃO ASM

Lição 8 - As instruções de salto DJNZ, JR e JP.



Anterior  Indice   Seguinte

   O CPU Z80 quando está a executar um programa e encontra um instrução de salto, carrega o registo PC (Program Counter) com o endereço indicado junto da mesma. A execução do programa prossegue então nesse novo endereço. Há 2 tipos de instruções de salto. No primeiro tipo é efectuado um salto relativo, quer dizer, a instrução indica o numero de bytes que a execução se deve mover, relativamente ao endereço actual. No segundo tipo, a instrução fornece um endereço absoluto para onde a execução deve saltar. Ambos os tipos de instruções têm vantagens e desvantagens, iremos ver quais são elas, mais à frente nesta lição. A primeira instrução que vamos mostrar é a JR dis. Esta instrução usa um salto relativo de -128 a +127 bytes. A vantagem deste tipo de salto reside no facto dele ser independente do endereço onde se encontra o programa, porque os endereços de salto são sempre calculados tendo em conta o valor actual do registo PC. No que toca à desvantagem, ela se deve ao alcance do salto, pois não pode exceder os 127 bytes numa direcção ou noutra. Vejamos um exemplo:

   Neste exemplo carregamos o programa no endereço 1000.

Endereço Instrução  
------------ -----------------  
1000 JR dis +0 Esta instrução carrega o registo PC com o endereço 1002 
1002 JR dis -4 Esta instrução usa 1 salto negativo de -4 bytes, o que dá
na pratica o endereço 1000 (1004-4).
1004 RET  
 
   O registo PC (Program Counter) aponta para o endereço 1002 após a descodificação da instrução JR dis + 0, porque a instrução JR dis tem 2 bytes de tamanho. O primeiro byte é o Opcode (código de operação), enquanto que o segundo é um deslocamento na gama de -128 a +127 bytes. O CPU ao executar a instrução adiciona o valor do deslocamento ao valor actual do registo PC, que neste caso é o endereço onde está a instrução + 2 = 1002. Se o valor do deslocamento for negativo, é subtraído ao registo PC, como é mostrado na instrução que está no endereço 1002. Se fizermos as contas temos, 1002+2-4=1000. Na pratica nunca precisaremos de fazer estas contas pois o compilador encarrega-se disso.

   A outra instrução de salto relativo que o Z80 possui é a DJNZ dis. Alias podemos dizer que é uma instrução mista porque além de instrução de salto JR NZ,dis ainda inclui a instrução DEC B. Portanto em ultima analise a instrução DJNZ dis primeiro decrementa o registo B (DEC B) e depois executa um salto relativo (JNZ dis) se o registo B for diferente de zero. Esta instrução é muito útil para criar ciclos de repetição nos programas. Seguem-se os detalhes das instruções de salto relativo.

Instrução:   JR dis
Propósito:   Executa um salto relativo para o endereço PC+dis.
OpCode:   24, dis
Ciclos:   12
Bytes:   2
Flags:   Nenhuma

   As próximas 5 instruções são instruções condicionais, quer dizer, o salto só é realizado se as flags apresentarem o valor correcto. Nas instruções condicionais são apresentados 2 tempos de execução, o maior refere-se a quando a instrução é executada enquanto que o menor diz respeito à não execução da mesma. 

Instrução:   JR NZ,dis
Propósito:   Executa um salto relativo para o endereço PC+dis se o resultado da ultima operação for diferente de zero (Flag Z=0).
OpCode:   32, dis
Ciclos:   12/7
Bytes:   2
Flags:   Nenhuma

Instrução:   JR Z,dis
Propósito:   Executa um salto relativo para o endereço PC+dis se o resultado da ultima operação for zero (Flag Z=1).
OpCode:   40, dis
Ciclos:   12/7
Bytes:   2
Flags:   Nenhuma

Instrução:   JR NC,dis
Propósito:   Executa um salto relativo para o endereço PC+dis se o resultado da ultima operação não excedeu a capacidade de armazenamento do registo destino (Flag C=0).
OpCode:   48, dis
Ciclos:   12/7
Bytes:   2
Flags:   Nenhuma

Instrução:   JR C,dis
Propósito:   Executa um salto relativo para o endereço PC+dis se o resultado da ultima operação excedeu a capacidade de armazenamento do registo destino (Flag C=1).
OpCode:   56, dis
Ciclos:   12/7
Bytes:   2
Flags:   Nenhuma

Instrução:   DJNZ dis
Propósito:   Decrementa o registo B e executa um salto relativo para o endereço PC+dis se o registo B for diferente de Zero.
OpCode:   16, dis
Ciclos:   13/8
Bytes:   2
Flags:   Nenhuma

   As instruções de salto seguintes (JUMP abreviadas para JP) usam endereços absolutos, por outras palavras, não utilizam um deslocamento mas sim um endereço na gama de 0 a 65535, abrangendo portanto a totalidade da memoria do Z80. Vejamos então os detalhes dessas instruções.

Instrução:   JP nn
Propósito:   Executa um salto para o endereço nn.
OpCode:   195, nn
Ciclos:   10
Bytes:   3
Flags:   Nenhuma

Instrução:   JP (HL)
Propósito:   Executa um salto para o endereço indicado no registo HL.
OpCode:   233
Ciclos:   4
Bytes:   1
Flags:   Nenhuma

Instrução:   JP (IX)
Propósito:   Executa um salto para o endereço indicado no registo  IX.
OpCode:   221,233
Ciclos:   8
Bytes:   2
Flags:   Nenhuma

Instrução:   JP (IY)
Propósito:   Executa um salto para o endereço indicado no registo IY.
OpCode:   253,233
Ciclos:   8
Bytes:   2
Flags:   Nenhuma

   A instrução JP também possui versões de salto condicional e que são as seguintes:

Instrução:   JP NZ,nn
Propósito:   Executa um salto para o endereço nn se o resultado da ultima operação for diferente de zero (Flag Z=0).
OpCode:   194, nn
Ciclos:   10
Bytes:   3
Flags:   Nenhuma

Instrução:   JP Z,nn
Propósito:   Executa um salto para o endereço nn se o resultado da ultima operação for zero (Flag Z=1).
OpCode:   202, nn
Ciclos:   10
Bytes:   3
Flags:   Nenhuma

Instrução:   JP NC,nn
Propósito:   Executa um salto para o endereço nn se o resultado da ultima operação não excedeu a capacidade de armazenamento do registo destino (Flag C=0).
OpCode:   210, nn
Ciclos:   10
Bytes:   3
Flags:   Nenhuma

Instrução:   JP C,nn
Propósito:   Executa um salto para o endereço nn se o resultado da ultima operação excedeu a capacidade de armazenamento do registo destino (Flag C=1).
OpCode:   218, nn
Ciclos:   10
Bytes:   3
Flags:   Nenhuma

Instrução:   JP PO,nn
Propósito:   Executa um salto para o endereço nn se o nº de bits que estão a "1" no resultado da ultima operação for IMPAR (Paridade Impar).
OpCode:   226, nn
Ciclos:   10
Bytes:   3
Flags:   Nenhuma

Instrução:   JP PE,nn
Propósito:   Executa um salto para o endereço nn se o nº de bits que estão a "1" no resultado da ultima operação for PAR (Paridade Par).
OpCode:   234, nn
Ciclos:   10
Bytes:   3
Flags:   Nenhuma

Instrução:   JP P,nn
Propósito:   Executa um salto para o endereço nn se o resultado da ultima operação for positivo (Flag S=0).
OpCode:   242, nn
Ciclos:   10
Bytes:   3
Flags:   Nenhuma

Instrução:   JP M,nn
Propósito:   Executa um salto para o endereço nn se o resultado da ultima operação for negativo (Flag S=1).
OpCode:   250, nn
Ciclos:   10
Bytes:   3
Flags:   Nenhuma

   No que diz respeito ás instruções de salto chegamos ao fim. Iremos ver ao longo do curso exemplos práticos do uso destas instruções.


Próxima Lição - O funcionamento do STACK e das instruções RST, CALL, RET, PUSH e POP.


Anterior  Indice   Seguinte






P
U
B
L
I
C
I
D
A
D
E
Copyright 2005-2022 ZX-BATTLE. Todos os direitos Reservados