A 2-pass assembler for a simple instruction set, along with an emulator to run the assembled programs.
If assembly is successful, a listing file and an object file is produced. A log file is also produced to show warnings.
The object file generated is executable on the included Emulator only.
There is no support for linking multiple object-files. Every program written in this instruction set should be in one program file only.
The assembly language is for a machine with 4 registers:
-
2 registers, A and B, arranged as an internal stack
-
A program counter, PC
-
A stack pointer, SP
-
The registers are 32-bits in size.
-
Instructions have either no operands or a single opeand. The operand, if present, is a signed 2's complement value. An operand can be a label as well, or a number in decimal, octal or hexadecimal form. The encoding usess bottom 8 bits for the opcoe and the upper 24 bits for the operand.
-
The language is line-based (one statement per line), like most other assembly languages.
-
Comments begin with a ; and anything on the line after ; is ignored.
-
Blank lines, spaces and tabs are allowed.
-
label definition - A label name followed by a : and an optinal statement. A label name is an alphanumeric string starting with a letter. A label use is just the label name. For branch instructions, label use calculates the displacement and for other instructions, the label value is used directly.
NOTE: The instructions semantics do not show the incrementing of the PC to the next instruction. This is implicitly performed by each instruction before the actions of the instruction are done.
Mnemonic | Opcode | Operand | Formal Specification | Description |
---|---|---|---|---|
data | value | Reserves a memory location initialized to the value specified | ||
ldc | 0 | value | B:=A; A:=value; | Load accumulator with the value specified |
adc | 1 | value | A := A + value; | Add the value specified to the accumulator |
ldl | 2 | offset | B := A; A := memory[SP+offset]; | Load local |
stl | 3 | offset | memory[SP+offset] := A; A := B | Store local |
ldnl | 4 | offset | A := memory[A+offset]; | Load non-local |
stnl | 5 | offset | memory[A+offset] := B; | Store non-local |
add | 6 | A := B+A; | Addition | |
sub | 7 | A := B-A; | Subtraction | |
shl | 8 | A := B<<A; | Shift left | |
shr | 9 | A := B>>A; | Shift right | |
adj | 10 | value | SP := SP+value; | Adjust SP |
a2sp | 11 | SP:=A; A:=B; | Transfer A to SP | |
sp2a | 12 | B:=A; A:=SP; | Transfer SP to A | |
call | 13 | offset | B:=A; A:=PC; PC:=PC+offset; | Call procedure |
return | 14 | PC:=A; A := B; | Return from procedure | |
brz | 15 | offset | if A == 0 then PC:=PC+offset; | If accumulator is zero, branch to specified offset |
brlz | 16 | offset | if A < 0 then PC:=PC+offset; | If accumulator is less than , branch to specified offset |
br | 17 | offset | PC:=PC+offset; | Branch to specified offset |
HALT | 18 | Stop the emulator. This is not a real instruction, but needed to tell the emulator when to finish. | ||
SET | value | Set the label on this line to the specified value, rather than the PC. |