Fake assembly
This is a fake assembly language. It is used for educational purpose only.
To run this program you need Golang installed in your machine. Then run:
$ go run . ./examples/a1.asm
The target file name must end with .asm
.
How to access memory
We limit the memory to have only 1024 slots. Every slot is initialized with 0.
1. Constants
To use constants you just need to use a number without any prefix. Like:
123
321
Are all constants
2. Variables
A variable is a direct access to memory, you can do that by just adding the prefix $
and an index for the position that you want to access. Suppose that your memory look like this [4,3,6,7,8] so:
$1 # Here you are accessing the memory indexed by 1 so of this is 3
$0 # Here you are accessing the memory indexed by 0 so of this is 4
3. Reference
Reference is an indirect access to memory, where a variable will define the slot position that you want to access. Again suppose that the memory look like this [2,3,8,7] so:
&1 # Here you use the memory at '1'(value == 3) as an index, similar to memory[memory[1]] = 7
&0 # Here you use the memory at '0'(value == 2) as an index, similar to memory[memory[0]] = 8
Instructions
1. Operation
Write the result of the operation {C, $, &}1 {-, +, *, /} {C, $, &}2
to memory {$, &}0
.
$0 = 232 + &12
&1 = $12 / 2
2. Label
To define a label you can do that by just
{label}:
Replace {label}
with an appropriate value.
3. To
Change the code flow if the predicate is true the pattern is to {label} if {C, $, &}1 {==, !=, >, <, >=, <=} {C, $, &}1 {&&, ||} ...
.
to main if 1 == 1
some_label:
$0 = $0 + 1
to main if &1 <= &2 || $1 > 2
main:
$0 = $0 - 1
to some_label if $0 > 1 && $0 < 12
5. Write
Print a value. Suppose that your memory looks like this [1,2,3,4,5]
.
print 1 # Will print `$ 1`
print $1 # Will print `$ [ 1 ] 2`
print &1 # Will print `$ [ 1 -> 2 ] 3`
6. Read
Read a value from the input file. Will jump to the label provided if unable to read(optional).
read $0
read $0 end
read $0 end
end:
write $0