Pular para o conteúdo principal

Lista de instruções

Abaixo encontra-se uma lista de todas as funções definidas por padrão para a linguagem assembly do processador ICMC. Para cada instrução acompanha-se

  • uma explicação da sua funciojnalidade ou um pseudo-código explicativo, este último em notação semelhante a encontrada na linguagem de programação C.
  • a especificação do formato da instrução em código binário. Assume-se as seguintes convenções:
    • x: bit cujo valor para a instrução em questão não é significativo;
    • |: separação entre os campos da instrução;
    • c: "carry"
    • > end: um endereço de memória, com 16 bits de extensão, descrito na linha seguinte a instrução;
    • > num: um valor inteiro e positivo, com 16 bits de extensão, descrito na linha seguinte a instrução.

Instruções de manipulação de dados

Acesso à memória

Instruções para escrita (store) na, e leitura (load) da, memória.

MnemônicoPseudo-códigoFromato da instrução
store label, rx*label = rx110001 | rx | xxxxxxx | > end
storei rx, ry**rx = ry111101 | rx | ry | xxxx
load rx, labelrx = *label110000 | rx | xxxxxxx | > end
loadi rx, ryrx = **ry111100 | rx | ry | xxxx
loadn rx, #numrx = num111000 | rx | xxxxxxx | > num

Movimentação entre registradores

Copia o valor de um registrador a outro.

MnemônicoPseudo-códigoFormato da instrução
mov rx, ryrx = ry110011 | rx | ry | xxx0
mov rx, sprx = sp110011 | rx | xxxxx01
mov sp, rxsp = rx110011 | rx | xxxxx11

Operações aritméticas

MnemônicoPseudo-códigoFormato da instrução
add rx, ry, rzrx = ry + rz100000 | rx | ry | rz | 0
addc rx, ry, rzrx = ry + rz + carry100000 | rx | ry | rz | 1
sub rx, ry, rzrx = ry - rz100001 | rx | ry | rz | 0
subc rx, ry, rzrx = ry - rz + carry100001 | rx | ry | rz | 1
mul rx, ry, rzrx = ry × ry100010 | rx | ry | rz | 0
mulc rx, ry, rzrx = ry × ry + carry100010 | rx | ry | rz | 1
div rx, ry, rzrx = ry ÷ ry100011 | rx | ry | rz | 0
divc rx, ry, rzrx = ry ÷ ry + carry100011 | rx | ry | rz | 1
mod rx, ry, rzrx = ry % ry100101 | rx | ry | rz | 0
modc rx, ry, rzrx = ry % ry + carry100101 | rx | ry | rz | 1
inc rxrx + 1100100 | rx | 0 | xxxxxx
dec rxrx - 1100100 | rx | 1 | xxxxxx
info

Quando uma operação aritmética resulta em zero ou número negativo, o registrador fr assume um valor correspondente para indicar estes resultados.

Operações lógicas

MnemônicoPseudo-códigoFormato da instrução
and rx, ry, rzrx = ry & rz010010 | rx | ry | rz | x
or rx, ry, rzrx = ry | rz010011 | rx | ry | rz | x
xor rx, ry, rzrx = ry ^ rz010100 | rx | ry | rz | x
not rx, ryrx = ~ry010101 | rx | ry | xxxx

Movimentação de bits

Comandos aqueles que manipulam os valores armazenados nos registradores em sua forma binária.

rotl

MnemônicoFormato da instrução
rotl rx, #num010000 | rx | 10x | num

Move todos os bits num dígitos à esquerda sendo que os num dígitos mais significativos são "rotacionados": tornam-se os num dígitos menos significativos.

rotr

MnemônicoFormato da instrução
rotr rx, #num010000 | rx | 11x | num

Move todos os bits num dígitos à direita sendo que os num dígitos menos significativos tornam-se os num dígitos mais significativos.

shiftl0

MnemônicoFormato da instrução
shiftl0 rx, #num010000 | rx | 000 | num

Move todos os bits num dígitos à esquerda, e preenche os num bits menos significativos com 0.

shiftl1

MnemônicoFormato da instrução
shiftl1 rx, #num010000 | rx | 001 | num

Move todos os bits num dígitos à esquerda, e preenche os num bits menos significativos com 1.

shiftr0

MnemônicoFormato da instrução
shiftr0 rx, #num010000 | rx | 010 | num

Move todos os bits num dígitos à direita, e preenche os num bits mais significativos com 0.

shiftr1

MnemônicoFormato da instrução
shiftr1 rx, #num010000 | rx | 011 | num

Move todos os bits num dígitos à direita, e preenche os num bits mais significativos com 1.

info

Em todas as instruções de movimentação de bits, num é um número inteiro positivo com 4 bits de extensão.

Entrada e saída

Input

MnemônicoFormato da instrução
inchar rx110101 | rx | xxxxxxx

Armazena em rx um valor correspondente a uma tecla pressionada no momento em que a instrução é lida.

info

O valor armazenado quando nenhuma tecla estiver pressionada é 255.

Output

MnemônicoFormato da instrução
outchar rx, ry110010 | rx | xxxx

Imprime na posição da tela de índice ry o caractere de índice rx.

Pilha

Armazena (push) ou retira (pop) dados da pilha.

MnemônicoFormato da instrução
push rx000101 | rx | 0 | xxxxxx
push fr000101 | xxx | 1 | xxxxxx
pop rx000110 | rx | 0 | xxxxxx
push fr000110 | xxx | 1 | xxxxxx

Comparação

MnemônicoFormato da instrução
cmp rx, ry010110 | rx | ry | xxxx

A depender do resultado da comparação entre os valores armazenados em rx e ry, o registrador fr assume um valor para indicar se rx é igual, maior, ou menor que ry.

Jump

Se a condição posta corresponder àquela lida em fr, então pc = *label

MnemônicoCondiçãoFormato da instrução
jmp labelIncondicional000010 | 0000 | xxxxxx
jeq labelIgual (EQual)000010 | 0001 | xxxxxx
jne labelIgual (Not Equal)000010 | 0010 | xxxxxx
jz labelÉ zero (Zero)000010 | 0011 | xxxxxx
jnz labelNão é zero (Not Zero)000010 | 0100 | xxxxxx
jc labelHá carry (Carry)000010 | 0101 | xxxxxx
jnc labelNão há carry (No Carry)000010 | 0110 | xxxxxx
jgr labelÉ maior que (GReater than)000010 | 0110 | xxxxxx
jle labelÉ menor que (LEsser than)000010 | 1000 | xxxxxx
jeg labelÉ igual ou maior (Equal or Greater)000010 | 1001 | xxxxxx
jel labelÉ igual ou menor (Equal or Lesser)000010 | 1010 | xxxxxx
jov labelHouve overflow (OVerflow)000010 | 1011 | xxxxxx
jnov labelNão houve overflow (No OVerflow)000010 | 1100 | xxxxxx
jn labelResultado negativo (Negative)000010 | 1101 | xxxxxx
jdz labelDivisão por Zero (Division by Zero)000010 | 1110 | xxxxxx

Call

Se a condição posta corresponder àquela lida em fr então executa-se as seguintes instruções:

push pc
jmp label
MnemônicoCondiçãoFormato da instrução
call labelIncondicional000011 | 0000 | xxxxxx
ceq labelIgual (EQual)000011 | 0001 | xxxxxx
cne labelIgual (Not Equal)000011 | 0010 | xxxxxx
cz labelÉ zero (Zero)000011 | 0011 | xxxxxx
cnz labelNão é zero (Not Zero)000011 | 0100 | xxxxxx
cc labelHá carry (Carry)000011 | 0101 | xxxxxx
cnc labelNão há carry (No Carry)000011 | 0110 | xxxxxx
cgr labelÉ maior que (GReater than)000011 | 0110 | xxxxxx
cle labelÉ menor que (LEsser than)000011 | 1000 | xxxxxx
ceg labelÉ igual ou maior (Equal or Greater)000011 | 1001 | xxxxxx
cel labelÉ igual ou menor (Equal or Lesser)000011 | 1010 | xxxxxx
cov labelHouve overflow (OVerflow)000011 | 1011 | xxxxxx
cnov labelNão houve overflow (No OVerflow)000011 | 1100 | xxxxxx
cn labelResultado negativo (Negative)000011 | 1101 | xxxxxx
cdz labelDivisão por Zero (Division by Zero)000011 | 1110 | xxxxxx

Retorno

Complementar a instrução call, esta realiza:

loadi pc, sp
inc sp
inc pc
MnemônicoFormato da Instrução
rts000100 | xxxx | x | xxxxx

Controle

MnemônicoAçãoFormato da Instrução
clearcc = 0001000 | 0 | xxxxxxxxx
setcc = 1001000 | 1 | xxxxxxxxx
haltPara execução do programa001111 | xxxxxxxxxx
nopNão realiza qualquer operação000000 | xxxxxxxxxx
breakpInsere ponto de parada001110 | xxxxxxxxxx