Voorwoord

Deze handleiding is voor (ervaren) programmeurs, die reeds ervaring hebben met Assembly achtige talen.
Komen woorden als 'stack', 'indentifiers' en 'operatoren' je niet bekend voor, dan is er altijd nog Visual Basic :)

Inhoud

Datatypen

CodeTypenaamBytesOmschrijving
0x01char1Karakters of zeer kleine getallen
0x02short2Kleine getallen
0x03int4Grote getallen
0x04double8Getallen met een floating point
0x05bool1Boolean (true / false)

Instructies

CodeInstructieParameter(s)Omschrijving

Basis operatoren
0x01JMPLocatieSpringt naar een locatie in de code
0x02RETSpringt terug naar een locatie in de code
0x03PUSHVariabeleZet de waarde van de variabele op de stack
0x04POPVariabeleHaalt een waarde van de stack en zet deze in de variabele
0x05EXITBeëindigt het programma
0x06INTBYTE functie,
BYTE subfunctie
Roept een interrupt functie aan

Toekenningoperator
0x20MOVVariabele doel
Variabele bron
Kopieert een variabele

Rekenoperatoren
0x21ADDVariabele doel
Variabele waarde1
Variabele waarde2
Telt waarde1 en waarde2 bij elkaar op
0x22SUBVariabele doel
Variabele waarde1
Variabele waarde2
Trekt waarde2 van waarde1 af
0x23DIVVariabele doel
Variabele waarde1
Variabele waarde2
Deelt waarde1 met waarde2
0x24MULVariabele doel
Variabele waarde1
Variabele waarde2
Vermenigvuldigt waarde1 met waarde2
0x25MODVariabele doelVariabele waarde1
Variabele waarde2
Geeft restwaarde van de deling van waarde1 en waarde2
0x26INCVariabele doelVerhoogt een variabele met 1
0x27DECVariabele doelVerhoogt een variabele met 1

Vergelijkingsoperatoren
0x28JEVariabele waarde1
Variabele waarde2
Locatie
Springt naar een locatie in de code als waarde1 en waarde2 gelijk zijn
0x29JGVariabele waarde1
Variabele waarde2
Locatie
Springt naar een locatie in de code als waarde1 groter is dan waarde2
0x2AJSVariabele waarde1
Variabele waarde2
Locatie
Springt naar een locatie in de code als waarde1 kleiner is dan waarde2
0x2BJNEVariabele waarde1
Variabele waarde2
Locatie
Springt naar een locatie in de code als waarde1 en waarde2 niet gelijk zijn
0x2CJGEVariabele waarde1
Variabele waarde2
Locatie
Springt naar een locatie in de code als waarde1 groter dan of gelijk aan waarde2
0x2DJSEVariabele waarde1
Variabele waarde2
Locatie
Springt naar een locatie in de code als waarde1 kleiner dan of gelijk aan waarde2

Bitoperatoren
0x30ANDVariabele doel
Variabele waarde1
Variabele waarde2
Voert een EN operatie uit op bit niveau
0x31ORVariabele doel
Variabele waarde1
Variabele waarde2
Voert een OF operatie uit op bit niveau
0x32XORVariabele doel
Variabele waarde1
Variabele waarde2
Voert een eXusieve OF operatie uit op bit niveau
0x33NOTVariabele doel
Variabele waarde
Draait de eerste bit van een waarde om, enkel voor boolean gebruik!
0x34INVVariabele doel
Variabele waarde
Slaat alle bitjes om, dus 1 wordt 0 en visa versa
0x35SHIFTLVariabele doel
Variabele waarde
Variabele plaatsen
Schuift alle bitjes van waarde het aantal plaatsen naar links
0x36SHIFTRVariabele doel
Variabele waarde
Variabele plaatsen
Schuift alle bitjes van waarde het aantal plaatsen naar rechts

Wiskundige operatoren
0x40COSVariabele doel
Variabele hoek
Geeft de cosinus waarde (double) van de gedefinieerde hoek
0x41SINVariabele doel
Variabele hoek
Geeft de sinus waarde (double) van de gedefinieerde hoek
0x42TANVariabele doel
Variabele hoek
Geeft de tangens waarde (double) van de gedefinieerde hoek
0x43SQRTVariabele doel
Variabele waarde
Geeft de wortel (double) van de gedefinieerde waarde
0x44EXPVariabele doel
Variabele waarde
Geeft de exponentiële waarde (double) van de gedefinieerde waarde
0x45LOGVariabele doel
Variabele waarde
Geeft het natuurlijk logaritme (double) van de gedefinieerde waarde
0x46LOG10Variabele doel
Variabele waarde
Geeft het logaritme, met 10 als basis, (double) van de gedefinieerde waarde
0x47POWVariabele doel
Variabele x
Variabele y
Geeft de machtsverheffing van: x y

Interrupts

FunctieSubfunctieOmschrijving
0x01 Print een waarde naar de console van het type dat als subfunctie is gedefinieerd.
De status van de actie wordt als een int op de stack gezet. 0 = fout, anders het aantal geprinte karakters.
 0x01

(print char)

char karakter 'A'
main:
PUSH karakter
INT 0x01, 0x01
 0x02

(print short)

short getal 65
main:
PUSH getal
INT 0x01, 0x02
 0x03

(print int)

int getal 65
main:
PUSH getal
INT 0x01, 0x03
 0x04

(print double)

double getal 65.0
main:
PUSH getal
INT 0x01, 0x04
 0x05

(print bool)

bool isoud true
main:
PUSH isoud
INT 0x01, 0x05
 0x06

(print string)

char tekst "Hallo wereld"
main:
PUSH &tekst
INT 0x01, 0x06
0x02 Leest een waarde in via de console van het type dat als subfunctie is gedefinieerd.
De status van de actie wordt als een int op de stack gezet. 0 = fout, anders het aantal gelezen karakters.
 0x01

(lees char)

char karakter 0
main:
PUSH &karakter
INT 0x02, 0x01
 0x02

(lees short)

short getal 0
main:
PUSH &getal
INT 0x02, 0x02
 0x03

(lees int)

int getal 0.0
main:
PUSH &getal
INT 0x02, 0x03
 0x04

(lees double)

double getal 0x00
main:
PUSH &getal
INT 0x02, 0x04
 0x06

(lees string)

char tekst "          "
main:
PUSH &tekst
INT 0x02, 0x06
0x03 Functionaliteit met betrekking tot getallen.
Het antwoord van een actie wordt als een int op de stack gezet.
 0x01

(ceil)

Rond een double waarde af naar boven.

double getal 3.14
main:
PUSH getal
INT 0x03, 0x01
POP getal

 0x01

(floor)

Rond een double waarde af naar beneden.

double getal 3.14
main:
PUSH getal
INT 0x03, 0x02
POP getal

 0x01

(random)

Genereerd een random getal.

int minimaal 1
int maximaal 50
int getal 0
main:
PUSH minimaal
PUSH maximaal
INT 0x03, 0x03
POP getal

Opbouw van code

Commentaar

Commentaar wordt binnen de code aangegeven door een ; (puntkomma) neer te zetten.

Code voorbeeld:
; Dit is commentaar

Variabelen en data

Variabelen wordt binnen de code gedefinieerd door de volgende syntax: Typenaam  indentifiernaam  waarde.
Belangrijk is om te weten dat de typenaam altijd met kleine letters wordt geschreven.

Code voorbeeld:
int	getal	125

Tijdens de declaratie moet er een beginwaarde gedefinieerd worden! Uiteraard kunnen er meerdere datadefenities onder elkaar gezet worden.

Code voorbeeld:
int	getal	125
short	getal2	45
bool	groter	false

Voor de naam geldt dat deze niet mag beginnen met een cijfer. Mocht je dit wel doen zal de assembler geen foutmelding geven, maar is de variabele niet meer benaderbaar!

Definiëren van data

Het definieren kan op verschillende manieren. Er is ondersteuning voor het decimale, hexadeciale, binaire en ascii waarden.

int	getal	125		; Decimaal 125
int	getal2	0x7D		; Hexadecimaal 125
int	getal3	0b01111101	; Binair 125
int	getal4	'}'		; Asciicode 125

Defenities

Defenities worden gemaakt op de volgende manier:

define PI	3.14159265
define PHI	1.61803398

Defenities kunnen enkel als argument voor de diverse instructies gebruikt worden.

Array's

Het is ook mogelijk om array's te creëren door de array indentifiers te gebruiken: [] achter de indentifiernaam.

Code voorbeeld:
int	getallen[]	125, 456, 721, 100
double	metingen[]	25.88, 26.76, 24.55

De komma's geven aan dat er een nieuw getal volgt, let er wel op dat deze direct achter de waarde staan (dus niet eerst een spatie o.i.d)! Indexen van array's beginnen bij 0.

Strings

Een array van karakters kan op twee manieren gedefinieerd worden.

Code voorbeeld:
char	tekst[]	'W', 'e', 'l', 'k', 'o', 'm'

Maar de onderstaande manier is makkelijker.

Code voorbeeld:
char	tekst[]	"Welkom"

Let op: Bij dit soort strings wordt er automatisch een 0 achter de tekst geplakt. Dit maakt het makkelijker om de tekst af te drukken. De volgende opties zijn ook mogelijk.

Code voorbeeld:
char	manier1[]	"Welkom allemaal,",
			" Deze losse strings worden",
			" netjes aan elkaar geplakt"

char	manier2[]	"Via deze manier is het mogelijk
om direct enters binnen de string te verwerken.
Handig toch?"

Als laatste mogelijkheid kan er ook gebruik worden gemaakt van speciale karakters binnen een string, bijvoorbeeld: een tab (\t), receiptfeed (\r), newline (\n) en de 0 (\0). Deze kunnen via de specialcharacter indentifier \ gedefinieerd worden.

Code voorbeeld:
char	tekst[]	"Welkom,\r\nDit is een nieuwe regel."

Procedures

Het is mogelijk om verschillende procedures binnen de code te verwerken. Deze kunnen gedefinieerd worden door een indentifiernaam op te geven, direct gevolgt door een : (dubbelepunt).

Code voorbeeld:
int	getal1	100
int	getal2	54

procedure1:
	; Hier komt de code

Een pre is dat er altijd een main: procedure in de code aanwezig is! Dit is namelijk de startplek van je applicatie! Het is aan te raden deze altijd onderin de code te plaatsen.

Code voorbeeld:
int	getal1	100
int	getal2	54

procedure1:
	; Hier komt de code voor procedure 1

procedure2:
	; Hier komt de code voor procedure 2

main:
	; Hier start de applicatie!

Mocht er geen main procedure aanwezig zijn zal de assembler een foutmelding geven.

Programma structuur

Tijdens het assembleren van de code, worden zowel data als code indentifiers verzameld. Mocht er ergens in de code een referentie staan naar een stuk data of code dat er boven nog niet is gedefinieerd, zal er een foutmelding worden gegeven dat de indentifier niet is gevonden.

Code voorbeeld:
int	getal1	100

procedure1:
	; Hier komt de code voor procedure 1

int	getal2	54

main:
	; Hier start de applicatie!
	; Vanuit hier kunnen getal3 en procedure2 niet benaderd worden!

int	getal3	17

procedure2:
	; Hier komt de code voor procedure 2
	; Maar dat heeft hier weinig zin.

Werken met instructies

De diverse instructies kunnen verwerkt worden door volgende syntax: INSTRUCTIE paramater1, parameter2, ect.
Belangrijk is om te weten dat de instructies altijd met HOOFDLETTERS worden geschreven.

Het onderstaande voorbeeld telt drie getallen bij elkaar op en druk de uitkomst af.

int	getal1		100
int	getal2		54
int	uitkomst	0

main:
	ADD	uitkomst, getal1, getal2	; getal1 en getal2 bij elkaar optellen
	ADD	uitkomst, uitkomst, 600		; 600 bij de uitkomst optellen
	PUSH	uitkomst			; De waarde van uitkomst op de stack zetten
	INT	0x01, 0x03			; De waarde van uitkomst laten printen
	EXIT					; Programma afsluiten

Paramters kunnen zowel variabelen als directe waarden zijn.

Pointers en adressen

Het is mogelijk om verwijzingen te maken naar een stuk geheugen, om bijvoorbeeld een routine te te kunnen schrijven die een willekeurige string afdrukt. Om dit te kunnen doen moet er eerst ruimte gereserveerd worden om het geheugenadres in op te slaan. Dit kan in een pointer variabele. Dit lijkt op een normale variabele, maar de naam begint met een * en heeft geen begin waarde.

char	*tekst	; Dit is een verwijzing naar een willekeurig karakter of string
int	*getal	; Dit is een verwijzing naar een willekeurig getal

Nu kunnen deze variabelen gevult worden met een geheugenadres. Deze kunnen op de volgende manieren opgegeven worden.

char	karakter	'A'	; Deze variabele staat op adres 0x05
char	*tekst

main:
	MOV	tekst, 0x05		; Handmatige toekenning (niet erg handig)
	MOV	tekst, &karakter	; Automatische toekenning (wel erg handig)
	EXIT

Het & teken betekend feitelijk 'adres van'. Het * teken betekend feitelijk 'inhoud van'. Hieronder staat een voorbeeld waarin er karakters uit een string vervangen kunnen worden.

char	vervanger	0	; Het vervangend karakter
char	*adres			; Verwijzing naar de string
short	offset		0	; De offset binnen de string

vervang_karakter:
	ADD	adres, adres, offset	; De pointer het aantal karakters opschuiven
	MOV	*adres, vervanger	; Karakter vervangen
	RET

char	welkom[]	"Welkom"	; Zonder pointer zou deze string niet benaderbaar zijn vanuit vervang_karakter

main:
	MOV	adres, &welkom
	MOV	offset, 3	; 4e karakter ('k')
	MOV	vervanger, 'd'
	JMP	vervang_karakter
	EXIT

Het programma 'Hello World!'

Een onderdeel wat niet kan en niet mag ontbreken is natuurlijk 'Hello World!'.

define	PRINT	0x01
define	STRING	0x06

char	tekst[]	"Hello World!"

main:
	PUSH	&tekst
	INT	PRINT, STRING
	EXIT

Assembleren en uitvoeren

De broncode dient opgeslagen te worden met de extentie .asm. Zo zou de 'Hello World' applicatie bijvoorbeeld 'HelloWorld.asm' kunnen heten.

Via het volgende commando (via commandprompt) kan de code geassembleerd worden: Assembler.exe HelloWorld.asm
De assembler zal automatisch het bestand 'HelloWorld.cuba' genereren binnen de zelfde als 'HelloWorld.asm'. De .cuba extentie geeft aan dat het een CUBA applicatie is.

Om het programma uit te voeren kan het volgende commando worden gebruikt: VirtualMachine.exe HelloWorld.cuba