Definição de novas instruções em assembly do Pepe
No assembly do Pepe a definição de uma nova instrução pode ser feita atrvaés da keyword DEF. A keyword DEF deve ser precedida do identificador da nova instrução e deve ser seguida dos itens que a compõem.
Exemplos: ADDM DEF ..., XPTO def ...
Note-se que a keyword pode ser escrita em maiúsculas ou minúsculas. Nos exemplos o sinal ... indica os itens que passamos a explicar.
O primeiro item a seguir à instrução DEF deverá ser uma etiqueta do tipo CTX seguida de um sinal igual e de um número. Este número deverá ser um código de operação que esteja livre. Dependendo do tipo de instrução este código poderá ocupar 4,8,12 ou 16 bit, o que é indicado pelo tipo da constante usada.
Exemplos: C4=2, C8=0feh, C12=323
Note-se que os números poderão ser indicados em qualquer uma das bases aceites pelo assembly e que as contantes poderão ser indicadas com letras maiúsculas ou minúsculas.
Após o primeiro item que é óbrigatório, seguem-se os itens opcionais que podem indicar registos, posições de memória, constantes, ou distâncias a posições no código.
O item do tipo C4, C8, C12 ou C16 indica que no local deverá ser colocado um número cujo valor máximo deverá caber no número de bits indicado, i.e. quando se utilizar uma instrução deste tipo dever-se-á colocar um número nessa posição.
Um item do tipo C8=20 indica que esse campo deverá ser automáticamente preenchido com o valor 20 de forma transparente para quem está a escrever a instrução.
Um item do tipo R ou AR indica que o utilizador deverá introduzir nessa posição um dos 16 registos (R0 a R15) ou um dos 16 regsitos auxiliares (A0 a A15).
Um item do tipo L4, L8, ou L12 deverá ser preenchido com uma etiqueta para uma posição de memória. No local deste item será colocado a diferença entre a posição de memória actual e a posição de memória indicada pela etiqueta a dividir por dois.
Um item do tipo [,],{,},+,*,-,/,$,%,.,(,),@,!,>,< indica que nessa posição deverá aparecer esse caracter. Este item é meramente indicativo e serve para diferenciar certas operações através da formatação.
Deste modo é possível definir várias instruções com o mesmo identificador cuja diferença está na formatação.
Exemplos: MOV R1,[R2] MOV R1,[[R2]] MOV R1,R2
Mas também é possível definir duas instruções com formatos distintos que fazem a mesma coisa.
Exemplos: MOV R1,[R2] MOV R1,[R2+0]
De seguida mostra-se o BNF completo da definção de instruções.
Formato BNF
<definition> ::= <identificador> DEF <fix> (<item>)*
<fix> ::= <ctx> "=" <number>
<ctx> ::= "C4" | "C8" | "C12" | "C16"
<item> ::= <fix> | <ctx> | <register> | <delta-ctx> | <marca>
<register> ::= "R" | "AR"
<delta-ctx> ::= "L4" | "L8" | "L12"
<marca> ::= "[", "]", "+", "-", "*", "/", "$", "%", ".", "(", ")", "{", "}", ",", "@", "!", ">", "<"
Alguns exemplos completos:
ADDM DEF C8=5EH [R], C4
SUM DEF C4=0EH R, [R], R