Red Rabbit: l’interprete assembler
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:
, 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!


agosto 1st, 2009 alle 11:36
[...] Red Rabbit v0.5b nella sezione [...]