|
|
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
|