Red Rabbit: l’interprete assembler

ivan @ 11:20

RedRabbit

Red Rabbit è un interprete assembler personalizzatio tra stile Mips e x86.

Download installer versione 0.5b
Download sorgente versione 0.5b

autore: Ivan Pagano
email: iv.pagano [at] gmail [dot] com



MANUALE DI RIFERIMENTO REDRABBIT

Le istruzioni sono CASE SENSITIVE!

//
esecuzione di ECHO – versione funzione: 0.1

echo
testo

Stamperà
solo una parola a video.

//
stampe immediate

_ equivale
ad uno spazio bianco

- uguale
a quello di sopra

. newline

\\ tab

//
esecuzione di PRINT – versione funzione: 0.3

E’
possibile usare:

print

, write
,
output

Faranno
tutte riferimento a “
print
. La sintassi è la seguente:

print(testo
e variabili come
$t0.
Anche stringhe identificate da
£).
Attenzione: L’uso del
$
rappresenta un doppio uso. In alcune funzioni i parametri possono
variare da registro a costante. Specificando $ si dice all’interprete
di considerare quel determinato registro. I registri sono stile
MIPS(r0…v0…a0…t0/t7…s0/s7…).

//
esecuzione di INPUT – versione funzione: 0.2

Il
comando input accetta un identificatore di registro o
l’identificatore della stringa di buffer(
£)

Esempio:

input
£

Chiede
in ingresso un dato di tipo stringa(da tastiera) memorizzando nel
buffer di default

input
s0

Chiede
in ingresso un dato di tipo numerico(e memorizza nel registro s0)

//
esecuzione di SLEEP – versione funzione: 0.2

sleep
attende determinati secondi e poi riprende l’esecuzione, il suo
alias è wait.

E’
possibile utilizzarlo in 2 modi:

sleep
$
t0

Che
aspetta un determinato numero di secondi prendendoli dal registro
t0(8).

Oppure
in modalità immediata:

sleep
3000

3000

è il numero di ms/sec … Praticamente 3 secondi.

//
esecuzione di CLEAR – versione funzione: 0.2

clear
o
cls

puliscono lo schermo

//
esecuzione di EXIT – versione funzione: 0.2

exit
,
quit
,
kill

o end
rispettivamente terminano il programma immediatamente a quel punto.

Il
comando
nop
non esegue nessuna operazione e va avanti.

pause

mette in pausa il programma, attende un input da tastiera e riprende.

Vediamo
alcune macro di ambiente:

debugOff disabilita
la modalità di debug

debugOn contrario,
attiva la modalità di debug

securityOn

attiva
la modalità sicura, chiede una conferma quando viene eseguito
il comando
command

, shell
e
dos

securityOff disattiva
la modalità sicura

//
—————————————————————————–

//
AMBITO MATEMATICO LOGICO

//
—————————————————————————–

add
t0,s0,s0

addi
t0,s0,2

La
sostanziale differenza tra operazioni immediate e non:

I
comandi terminanti con “
i
presentano un parametro completamente numerico:

Quindi:

addi
t0,s0,2

Mette
nel registro t0, la somma tra il contenuto del registro s0 e la
costante 2.

Mentre
nel caso successivo in t0 viene messo s0 + s0.

Altre
istruzioni, solo la parola chiave(stessa sintassi della precente
cambia l’azione):

sub
subi

Sottrazione

and

andi

And
bit a bit

or

ori

Or
bit a bit

not

noti

Not
bit a bit

mod

modi

Modulo

mol

moli

Moltiplicazione

div

divi

Divisione

andl

andli

And
logico

orl

orli

Or
logico

notl

notli

not
logico

Il
not e il not logico accettano solo 2 argomenti.

slt

slti

SLT
è uno standard del Mips, ecco un esempio

Ammettiamo
che t0=30 e s0=22

slt
t1,t0,s0

Determina
se t0 < s0, se vero, mette il valore 1 in t1, altrimenti mette il
valore 0 in t1.

Nel
caso immediato:

slti
t1,t0,333

mette
in t1 il valore vero solo se t0 è minore di 333.

Nella
versione 0.4 è stata aggiunta lo
string
length
, essendo di natura
numerico questo interprete, è disponibile solo una stringa.
Questa stringa (£) memorizza ad ogni ciclo nel registro
r1
la lunghezza della stringa
£.
Un utilità un po’ barbarica ma efficace.

//
—————————————————————————–

//
INIZIO DEI SALTI E CHIAMATE

//
—————————————————————————–

beq
o
je
fanno il controllo del flusso… Quando un programma deve
eseguire una diramazione queste istruzioni diramano il programma
saltando ad altri indirizzi. Cominciamo prima a capire cos’è

una label e come si costruisce:

Una
label(etichetta),
rappresenta un punto del programma in cui può essere raggiunta
mediante un salto.

label:

print(ciao).

jump
label

La
BEQ o il suo alias(JE=jump if equal) prende 2 registri e la label
dove saltare:

Qui
avviene un confronto:

beq
t0,$s0,label

Se
t0==s0 salta alla label indicata.


Al
contrario di
beq(je)
c’è
bne(jne).

ATTENZIONE:
L’uso del $ è permesso solo in queste 2 istruzioni al
secondo operando(questo per garantire che si possa usare anche una
costante numerica)

Altri
salti:

ja
t0,s0,label Salta solo se t0 > s0

jb

è il contrario di ja

jae
è come
ja,
solo che viene valutato anche l’uguale.

jbe
è come
jb,
solo che viene valutato anche l’uguale.

jc
salta solo se c’è un riporto nella divisione

jump
o
j o
jmp
saltano rispettivamente senza valutare alcun test:

jump

label … Salta incondizionatamente.

E’
possibile usare anche costanti numeriche:

beq
t0,1,label

Un
ultima aggiunta, è possibile saltare direttamente a funzioni
con la possibilità del ritorno attraverso
jec
e
jnec
(usati allo stesso modo)

LE
FUNZIONI

Capita
di creare delle funzioni nel proprio script, a differenza di un
semplice jump l’istruzione jal o alias call ricorda il salto da
dove è stato effettuato, e fa una copia corrente del contatore
di programma.

E’
possibile ritornare al programma dalla funzione chiamando return

..

call
nomefunzione

… dopo
la chiamata di funzione il return fa eseguire la prossima riga

.

..

Nomefunzione:

print(Mi
hai chiamato?).

return

INTERAGIRE
CON IL DOS

Spesso
capita di dover fare cose più laboriose, per evitare di
implementarle nel linguaggio, ho preferito che sia la shell di
sistema ad occuparsene(tipo cancellazione di files..)

Nel
caso di Windows, possiamo usare queste valide alternative:

dos
,
cmd
,
command

, shell

Facendo
un esempio chiaro:

dos(echo-Hello-World).

(Attenzione,
separa ogni parola da un trattino per indicare uno spazio).

E’
anche possibile usare all’interno dell’istruzione i
seguenti costrutti:

dos(echo-£)

O
anche:

dos(echo-£-$t0)

Ultimo:
shell(£)

UNO
SGUARDO ALLA MACRO GLOBALE “
£

Capita
di dover modificare la stringa globale senza chiederla in input,
possiamo tranquillamente eseguire tale assegnamento… tra parentesi
tonde:

£=(value)

Oppure

String=(value)

LA
MEMORIA VIRTUALE

load
t0, $t1

Mette
in t0 il contenuto locato all’indirizzo di memoria virtuale,
ovviamente l’indirizzo è specificato all’interno
del registro t1. Notare l’uso del doppio senso(
$).

E’
possibile ottenere riferimenti costanti in questo modo:

load
t0, 200

Al
contrario STORE fa l’opposto


ALTRE
FUNZIONI

La
funzione
randi
genera un numero casuale compreso da 0 all’intervallo definito
e lo salva in un registro secondo la seguente forma:

randi
t0,90

Genera
un numero casuale da 0 a 90 e lo mette in t0.

Analogamente
rand fa lo stesso:

rand
t0,s0

Solo
che la costante è contenuta in s0.

LE
NOVITA DELLA VERSIONE 0.5

E’
stato introdotto il doppio senso($) in varie istruzioni. E’ stata
creata la funzione
dec
e
inc

inc
t0,5

inc
t0,$t0

Un
altra novità è
mov

mov
t0,$s0

mov
s0,5

Inoltre
è possibile usare le domande:

£=(2+2_fa_4?)

question
t0

question”

invia una domanda sullo schermo(quest’ultimo contenuto nella stringa
speciale, dov’è possibile scegliere si o no).

Un
altra novità è lo stack!

push
s0

pop
t0

Ancora
un altra cosa… E’ possibile conoscere il clock usando
getCLOCK
, il tempo usando
getTIME
, il contatore di programma
getPC

e per finire getTOP
per ottenere la lunghezza dello stack!

Esempio
rapido:
getPC
t0

BUON
DIVERTIMENTO CON…

RED
RABBIT!

Un Commento a “Red Rabbit: l’interprete assembler”

  1. FireTeam » Red Rabbit… un interprete assebler says:

    [...] Red Rabbit v0.5b nella sezione [...]

Scrivi un commento