Instruções de controlo de fluxo

Voltar

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
PC 
¬  EIS + (2*dif)
SP
¬ SP - 2

Nenhuma

etiqueta Î [EIS-4096 .. EIS+4094]
SP só é actualizado no fim para ser re-executável

Rs

CODE

CR

xxxx

Rs

Mw[SP-2] ¬ RER
PC 
¬ Rs
SP
¬ SP - 2

Nenhuma

SP só é actualizado no fim para ser re-executável

CALLF

etiqueta

CALLF

dif =(etiqueta – EIS)/2

RL ¬ RER
PC 
¬  EIS + (2*dif)

Nenhuma

etiqueta Î [EIS-4096 .. EIS+4094]

Rs

CODE

CRF

xxxx

Rs

RL ¬ RER
PC 
¬ Rs

Nenhuma

 

RET

 

RET

xxxx

xxxx

PC ¬ Mw[SP]
SP
¬ SP + 2

Nenhuma

 

RETF

 

RETF

xxxx

xxxx

PC ¬ RL

Nenhuma

 

SWE

k

SWE

k

TEMP ¬ RE
RE
¬ 0
Mw[SP-2]
¬ RER
Mw[SP-4]
¬ TEMP
PC
¬ Mw[BTE+SWE_index]
SP
¬ SP - 4

Todas colocadas a zero

SP só é actualizado no fim para ser re-executável
k
Î [0 .. 255]
SWE_index é o endereço da excepção SOFTWARE na tabela de excepções.
Tem de se usar a pilha de sistema

RFE

 

RFE

xxxx

xxxx

TEMP ¬ Mw[SP]
PC
¬ Mw[SP+2]
SP
¬ SP + 4
RE
¬ TEMP

Todas restauradas

SP só é actualizado no fim para ser re-executável
Tem de se usar a pilha de sistema

NOP

 

NOP

xxxx

xxxx

 

Nenhuma

Não faz nada

Livre

 

 

 

 

 

 

 

Livre

 

 

 

 

 

 

 

Livre

 

 

 

 

 

 

 

Livre

 

 

 

 

 

 

 

Livre

 

 

 

 

 

 

 

Livre

 

 

 

 

 

 

 

Livre

 

 

 

 

 

 

 

Livre