Instruções de controlo de fluxo
Os aspectos mais importantes a ter em conta à partida são os seguintes:
· O PEPE suporta endereçamento de byte mas os acessos em busca de instrução têm de ser alinhados, pelo que os endereços têm de ser pares (senão é gerada uma excepção quando o acesso for feito). Para aumentar a gama de endereços que é possível atingir a partir das instruções que aceitam um operando imediato, o valor do operando codificado na instrução é entendido pelo PEPE como designando palavras (instruções) e não bytes, pelo que depois, na implementação das instruções, o PEPE multiplica automaticamente o operando por 2 (seja positivo ou negativo) antes de o utilizar no cálculo do endereço destino do salto;
· Todas as instruções de salto e de chamada de rotinas com operando imediato são relativas, isto é, o operando (em complemento para 2) é multiplicado por 2 e somado ao EIS (Endereço da Instrução Seguinte à instrução de salto). No entanto, para facilitar o utilizador, o assemblador requer não uma constante numérica mas sim um endereço simbólico, ou etiqueta (label), e o assemblador faz as contas. O assemblador gera um erro caso a constante (8 ou 12 bits, depende da instrução) não seja suficiente para codificar a diferença entre o valor da etiqueta e EIS. Se for o caso, o utilizador deve usar as instruções JUMP e CALL com endereçamento por registo. Estas últimas já têm endereçamento absoluto, isto é, o valor do registo é o novo endereço da instrução a buscar (e não somado com o anterior). Note-se que
L1: JMP L1 ; operando imediato Þ endereçamento relativo
resulta num ciclo infinito e o valor do operando codificado na instrução JMP é –1 (o que corresponde a subtrair -2 a EIS).
Classe |
Sintaxe em assembly |
Campos da instrução (16 bits) |
Acções |
Flags afectadas |
Comentários |
||||||
1º opcode (4bits) |
2º opcode (4bits) |
1º operando (4bits) |
2º operando (4bits) |
||||||||
Instruções de controlo de fluxo |
JZ |
etiqueta |
COND |
JZ |
dif =(etiqueta – EIS)/2 |
Z=1: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||
JNZ |
etiqueta |
JNZ |
dif =(etiqueta – EIS)/2 |
Z=0: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JN |
etiqueta |
JN |
dif =(etiqueta – EIS)/2 |
N=1: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JNN |
etiqueta |
JNN |
dif =(etiqueta – EIS)/2 |
N=0: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JP |
etiqueta |
JP |
dif =(etiqueta – EIS)/2 |
(NÚZ)=0: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JNP |
etiqueta |
JNP |
dif =(etiqueta – EIS)/2 |
(NÚZ)=1: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JC |
etiqueta |
JC |
dif =(etiqueta – EIS)/2 |
C =1: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JNC |
etiqueta |
JNC |
dif =(etiqueta – EIS)/2 |
C =0: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JV |
etiqueta |
JV |
dif =(etiqueta – EIS)/2 |
V=1: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JNV |
etiqueta |
JNV |
dif =(etiqueta – EIS)/2 |
V=0: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JA |
etiqueta |
JA |
dif =(etiqueta – EIS)/2 |
A=1 : PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JNA |
etiqueta |
JNA |
dif =(etiqueta – EIS)/2 |
A=0 : PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JEQ |
etiqueta |
JZ |
dif =(etiqueta – EIS)/2 |
Z=1: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JNE |
etiqueta |
JNZ |
dif =(etiqueta – EIS)/2 |
Z=0: PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JLT |
etiqueta |
JLT |
dif =(etiqueta – EIS)/2 |
NÅV =1 : PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JLE |
etiqueta |
JLE |
dif =(etiqueta – EIS)/2 |
((NÅV)ÚZ)=1 : PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JGT |
etiqueta |
JGT |
dif =(etiqueta – EIS)/2 |
((NÅV)ÚZ)=0 : PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JGE |
etiqueta |
JGE |
dif =(etiqueta – EIS)/2 |
NÅV =0 : PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS - 256 .. EIS + 254] |
|||||
JMP |
etiqueta |
JMP |
dif =(etiqueta – EIS)/2 |
PC ¬ EIS + (2*dif) |
Nenhuma |
etiqueta Î [EIS-4096 .. EIS+4094] |
|||||
Rs |
CODE |
JMPR |
xxxx |
Rs |
PC ¬ Rs |
Nenhuma |
|
||||
CALL |
etiqueta |
CALL |
dif =(etiqueta – EIS)/2 |
Mw[SP-2]
¬ RER |
Nenhuma |
etiqueta Î [EIS-4096 .. EIS+4094] |
|||||
Rs |
CODE |
CR |
xxxx |
Rs |
Mw[SP-2]
¬ RER |
Nenhuma |
SP só é actualizado no fim para ser re-executável |
||||
CALLF |
etiqueta |
CALLF |
dif =(etiqueta – EIS)/2 |
RL
¬ RER |
Nenhuma |
etiqueta Î [EIS-4096 .. EIS+4094] |
|||||
Rs |
CODE |
CRF |
xxxx |
Rs |
RL
¬ RER |
Nenhuma |
|
||||
RET |
|
RET |
xxxx |
xxxx |
PC
¬ Mw[SP] |
Nenhuma |
|
||||
RETF |
|
RETF |
xxxx |
xxxx |
PC ¬ RL |
Nenhuma |
|
||||
SWE |
k |
SWE |
k |
TEMP
¬ RE |
Todas colocadas a zero |
SP só é actualizado no fim para ser re-executável
|
|||||
RFE |
|
RFE |
xxxx |
xxxx |
TEMP
¬ Mw[SP] |
Todas restauradas |
SP só é actualizado no fim para ser re-executável |
||||
NOP |
|
NOP |
xxxx |
xxxx |
|
Nenhuma |
Não faz nada |
||||
Livre |
|
|
|
|
|
|
|
||||
Livre |
|
|
|
|
|
|
|
||||
Livre |
|
|
|
|
|
|
|
||||
Livre |
|
|
|
|
|
|
|
||||
Livre |
|
|
|
|
|
|
|
||||
Livre |
|
|
|
|
|
|
|
||||
Livre |
|
|
|
|
|
|
|
||||
Livre |
|
|
|
|
|
|
|