[ CHEAP ] [ CASM ] [ CSIM ] [ CSIM-P ] [ Impressum ]
Der CASM stellt einen einfachen 2-Pass Assembler dar. Im ersten Durchgang werden die Sprungmarken gesammelt. Danach wird im zweiten Durchgang der eigentliche Maschinencode erzeugt. Die Anwendung wurde weitestgehend unter Einsatz von Red Hat Linux 7.1 entwickelt. Die im Detail eingesetzten Werkzeuge gehen aus dem verwendeten Makefile hervor.
Das Übersetzen sollte auf allen Linux-Rechnern durch Ausführen des make Kommandos im entsprechenden Ordner möglich sein. Der Inhalt des verwendeten Makefiles ist nachfolgend aufgeführt.
makefile used to make CASM |
---|
all: Makefile casm.l casm.y casm.h flex -i casm.l yacc casm.y gcc -o casm y.tab.c -lfl rm lex.yy.c y.tab.c |
Der Aufruf des fertigen Assemblers ist dann denkbar einfach.
command line used to start CASM |
---|
./casm binary source |
Wie von vergleichbaren Werkzeugen bekannt, arbeitet auch CASM zeilenbasiert. Unnötige Whitespaces werden ignoriert. Groß- und Kleinschreibung werden einander gleich gesetzt. Eine Befehlszeile kann wie folgt schematisiert werden.
CASM instruction, scheme | CASM instruction, example | |
---|---|---|
[instr [rg1 [, rg2|imm|lab]]] [; remark] |
ADD r01, 255 ; adds 255 to current ; value of register 1 |
Der entsprechenden Registernummer bzw. dem Registernamenskürzel wird der Buchstabe r bzw. R vorangestellt. Werden bei benannten Registern keine Namenskürzel verwendet, wird während der Assemblierung eine Warnung ausgegeben, falls das Register als Ziel verwendet wird.
Konstanten werden im Quelltext ohne ein besonderes Prefix notiert. Als Suffix ist jedoch die Angabe einer Zahlenbasis erlaubt.
base | suffix | example |
---|---|---|
10 | 45 | |
02 | b | 101101b |
08 | p | 55p |
10 | d | 45d |
16 | h | 2Dh |
Zur Benennung von Sprungmarken dürfen alle Buchstaben als auch der Unterstrich verwendet werden. Eine Sprungmarke wird durch runde Klammern begrenzt. Dies gilt sowohl für die Definition des Ansprungpunktes als auch für den Einsatz eines Labels innerhalb einer Anweisung.
Zur Einleitung einer Definition existiert das Kürzel DW. Nach einem Whitespace folgt dann das Datum, das an entsprechender Stelle in der Binärdatei abgelegt werden soll.
define word, single value | define word, complete string | |
---|---|---|
DW 12 | DW 'free as in freedom' |
Jede Zeile in einer CASM-Quelldatei darf mit einem Kommentar versehen werden. Wie üblich wird dieser durch ein Semikolon eingeleitet und endet mit dem folgenden Zeilenumbruch bzw. dem Dateiende.
Mit dem unten aufgezeigten Programm wird eine einfache Tastaturabfrage realisiert. Nach dem achten Aufruf der Tastatur-ISR wird das Programm beendet. Die gedrückten Tasten werden von Offset 7 bis Offset 0 im Speicher abgelegt.
assembler source |
---|
JMP (BEGIN) DW 0 DW 0 DW 0 DW 0 DW 0 DW 0 DW 0 (IS_KEYPR) PDI r01, 00 ; keyboard uses port 0 SUB r02, 01 SW r01, r02 BEZ r02, r03 ISD (BEGIN) SET r02, 03 ; keyboard irq got priority 3 ISP r02, (IS_KEYPR) SET r02, 08 SET r03, 4095 ; end SUB rPC, 01 |
Bei dem unten aufgezeigten Programm sind von Offset 4 bis Offset 9 verschiedene Werte im Speicher abgelegt. Das Programm wartet auf einen Tastendruck und sucht den ASCII-Wert des eingegebenen Zeichens im genannten Speicherbereich. War die Suche erfolgreich, wird vor Programmende der Wert FFFFh nach Offset 0 geschrieben.
assembler source |
---|
; cheapAssembler code to test label recognition SET r0, 3 ; keyboard irq got priority 3 ISP r0, (KEYPRESSED) ; position of KEYPRESSED label JMP (START) DTA (START) (DATA) DW 102 DW 111 DW 111 DW 32 DW 98 DW 97 DW 114 (START) JMP (START) (KEYPRESSED) PDI r0, 0 ; keyboard uses port 0 SET r1, (START) ; array end at reg 1 SET r2, (DATA) ; array start at reg 2 (LOOP) LW r3, r2 ; read from array to reg 3 SUB r3, r0 ; sub key val from array val SET r4, (SUCCESS) BEZ r3, r4 ADD r2, 1 ; increase array pointer SET r4, (START) SUB r4, r2 ; zero if pointer equal array end SET r5, (FAILED) BEZ r4, r5 JMP (LOOP) (SUCCESS) SET r2, 0 SET r3, FFFFh SW r3, r2 ; store special value at pos zero (FAILED) JMP 4095 |