[ CHEAP ]   [ CASM ]   [ CSIM ]   [ CSIM-P ]   [ Impressum ]


Der Assembler CASM


Allgemeines

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.

Übersetzen und Aufruf

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              
            

Syntax einer Quelldatei

Allgemeines

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
            

Register

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.

Immediates

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

Sprungmarken

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.

Definitionen

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'

Kommentare

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.

Beispiele für Quelldateien

Tastaturabfrage

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
            

Suche im Speicher

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
            

[ CHEAP ]   [ CASM ]   [ CSIM ]   [ CSIM-P ]   [ Impressum ]