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 :)
| Code | Typenaam | Bytes | Omschrijving |
|---|---|---|---|
| 0x01 | char | 1 | Karakters of zeer kleine getallen |
| 0x02 | short | 2 | Kleine getallen |
| 0x03 | int | 4 | Grote getallen |
| 0x04 | double | 8 | Getallen met een floating point |
| 0x05 | bool | 1 | Boolean (true / false) |
| Code | Instructie | Parameter(s) | Omschrijving |
|---|---|---|---|
Basis operatoren | |||
| 0x01 | JMP | Locatie | Springt naar een locatie in de code |
| 0x02 | RET | Springt terug naar een locatie in de code | |
| 0x03 | PUSH | Variabele | Zet de waarde van de variabele op de stack |
| 0x04 | POP | Variabele | Haalt een waarde van de stack en zet deze in de variabele |
| 0x05 | EXIT | Beëindigt het programma | |
| 0x06 | INT | BYTE functie, BYTE subfunctie | Roept een interrupt functie aan |
Toekenningoperator | |||
| 0x20 | MOV | Variabele doel Variabele bron | Kopieert een variabele |
Rekenoperatoren | |||
| 0x21 | ADD | Variabele doel Variabele waarde1 Variabele waarde2 | Telt waarde1 en waarde2 bij elkaar op |
| 0x22 | SUB | Variabele doel Variabele waarde1 Variabele waarde2 | Trekt waarde2 van waarde1 af |
| 0x23 | DIV | Variabele doel Variabele waarde1 Variabele waarde2 | Deelt waarde1 met waarde2 |
| 0x24 | MUL | Variabele doel Variabele waarde1 Variabele waarde2 | Vermenigvuldigt waarde1 met waarde2 |
| 0x25 | MOD | Variabele doelVariabele waarde1 Variabele waarde2 | Geeft restwaarde van de deling van waarde1 en waarde2 |
| 0x26 | INC | Variabele doel | Verhoogt een variabele met 1 |
| 0x27 | DEC | Variabele doel | Verhoogt een variabele met 1 |
Vergelijkingsoperatoren | |||
| 0x28 | JE | Variabele waarde1 Variabele waarde2 Locatie | Springt naar een locatie in de code als waarde1 en waarde2 gelijk zijn |
| 0x29 | JG | Variabele waarde1 Variabele waarde2 Locatie | Springt naar een locatie in de code als waarde1 groter is dan waarde2 |
| 0x2A | JS | Variabele waarde1 Variabele waarde2 Locatie | Springt naar een locatie in de code als waarde1 kleiner is dan waarde2 |
| 0x2B | JNE | Variabele waarde1 Variabele waarde2 Locatie | Springt naar een locatie in de code als waarde1 en waarde2 niet gelijk zijn |
| 0x2C | JGE | Variabele waarde1 Variabele waarde2 Locatie | Springt naar een locatie in de code als waarde1 groter dan of gelijk aan waarde2 |
| 0x2D | JSE | Variabele waarde1 Variabele waarde2 Locatie | Springt naar een locatie in de code als waarde1 kleiner dan of gelijk aan waarde2 |
Bitoperatoren | |||
| 0x30 | AND | Variabele doel Variabele waarde1 Variabele waarde2 | Voert een EN operatie uit op bit niveau |
| 0x31 | OR | Variabele doel Variabele waarde1 Variabele waarde2 | Voert een OF operatie uit op bit niveau |
| 0x32 | XOR | Variabele doel Variabele waarde1 Variabele waarde2 | Voert een eXusieve OF operatie uit op bit niveau |
| 0x33 | NOT | Variabele doel Variabele waarde | Draait de eerste bit van een waarde om, enkel voor boolean gebruik! |
| 0x34 | INV | Variabele doel Variabele waarde | Slaat alle bitjes om, dus 1 wordt 0 en visa versa |
| 0x35 | SHIFTL | Variabele doel Variabele waarde Variabele plaatsen | Schuift alle bitjes van waarde het aantal plaatsen naar links |
| 0x36 | SHIFTR | Variabele doel Variabele waarde Variabele plaatsen | Schuift alle bitjes van waarde het aantal plaatsen naar rechts |
Wiskundige operatoren | |||
| 0x40 | COS | Variabele doel Variabele hoek | Geeft de cosinus waarde (double) van de gedefinieerde hoek |
| 0x41 | SIN | Variabele doel Variabele hoek | Geeft de sinus waarde (double) van de gedefinieerde hoek |
| 0x42 | TAN | Variabele doel Variabele hoek | Geeft de tangens waarde (double) van de gedefinieerde hoek |
| 0x43 | SQRT | Variabele doel Variabele waarde | Geeft de wortel (double) van de gedefinieerde waarde |
| 0x44 | EXP | Variabele doel Variabele waarde | Geeft de exponentiële waarde (double) van de gedefinieerde waarde |
| 0x45 | LOG | Variabele doel Variabele waarde | Geeft het natuurlijk logaritme (double) van de gedefinieerde waarde |
| 0x46 | LOG10 | Variabele doel Variabele waarde | Geeft het logaritme, met 10 als basis, (double) van de gedefinieerde waarde |
| 0x47 | POW | Variabele doel Variabele x Variabele y | Geeft de machtsverheffing van: x y |
| Functie | Subfunctie | Omschrijving |
|---|---|---|
| 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 | |
| 0x01 (floor) | Rond een double waarde af naar beneden. double getal 3.14 | |
| 0x01 (random) | Genereerd een random getal. int minimaal 1 |
Commentaar wordt binnen de code aangegeven door een ; (puntkomma) neer te zetten.
Code voorbeeld:; Dit is commentaar
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.
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!
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 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.
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.
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."
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.
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.
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.
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
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
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