-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[asm] Design the asmik
-- Sleepy VM Assembly language
#16
Comments
What we need
|
Registers:
| Reg | Name | Desc |
| --- | ---- | -------------- |
| r0 | ze | hardwired zero |
| r1 | ip | instr pointer |
| r2 | sp | stack pointer |
| r3 | ra | return addr |
| r4 | t1 | tmp |
| r5 | t2 | tmp |
| r6 | t3 | tmp |
| r7 | t4 | tmp |
| r8 | t5 | tmp |
| r9 | t6 | tmp |
| rA | a1 | args[0], ret |
| rB | a2 | args[1] |
| rC | a3 | args[2] |
| rD | a4 | args[3] |
| rE | a5 | args[4] |
| rF | a6 | args[5] |
Instructions:
| Mnem | Sym |
| ------------------ | ------------------------------- |
| addi rA, rB, rC | rA <- rB + rC |
| addim rA, rB, imm8 | rA <- rB + imm8 |
| muli rA, rB, rC | rA <- rB * rC |
| divi rA, rB, rC | rA <- rB / rC |
| remi rA, rB, rC | rA <- rB % rC |
| slti rA, rB, rC | rA <- (rB < rC) ? 1 : 0 |
| load rA, rB | rA <- [rB] |
| stor rA, rB | [rA] <- rb |
| orb rA, rB, rC | rA <- rB | rC |
| andb rA, rB, rC | rA <- rB & rC |
| xorb rA, rB, rC | rA <- rB ^ rC |
| brn rA, rB | ip <- (not rA) ? rB : ip + 4 |
| hlt | ... | |
Example: Arithmetics (sum (div 5 2) (rem (sum 2 2) 2)) label(main):
var(0): int = load(const(5): int): int
var(1): int = load(const(2): int): int
var(2): int = div(var(0): int, var(1): int): int
var(3): int = load(const(2): int): int
var(4): int = load(const(2): int): int
var(5): int = sum(var(3): int, var(4): int): int
var(6): int = load(const(2): int): int
var(7): int = rem(var(5): int, var(6): int): int
var(8): int = sum(var(2): int, var(7): int): int
var(9): int = load(const(0): int): int
return var(9): int memory stack:
- 000: 5 # const(5): int
- 008: 2 # const(2): int
memory instr:
- 000: addi r3, ze, ze # v0: int = load(c5: int): int
- 004: load r3, r3 #
- 008: addi r4, ze, 8 # v1: int = load(c2: int): int
- 012: load r4, r4 #
- 016: divi r5, r3, r4 # v2: int = div(v0: int, v1: int): int
- 020: addi r6, ze, 8 # v3: int = load(c2: int): int
- 024: load r6, r6 #
- 028: addi r7, ze, 8 # v4: int = load(c2: int): int
- 032: load r7, r7 #
- 036: addi r8, r6, r7 # v5: int = sum(v3: int, v4: int): int
- 040: addi r9, ze, 8 # v6: int = load(c2: int): int
- 044: load r9, r9 #
- 048: remi r10, r8, r9 # v7: int = rem(v5: int, v6: int): int
- 052: addi r11, r5, r10 # v8: int = sum(v2: int, v7: int): int
- 056: addi r12, ze, ze # var(9): int = load(const(0): int): int
- 060: load r12, r12 #
- 064: hlt |
Example: Conditional (if (eq 1 1) 1 1) label(main):
var(0): int = load(const(1): int): int
var(1): int = load(const(1): int): int
var(2): bool = eq(var(0): int, var(1): int): bool
if var(2): bool then label(0) else label(1) end label(2)
label(0):
var(3): int = load(const(1): int): int
goto label(2)
label(1):
var(4): int = load(const(1): int): int
var(3): int = copy(var(4): int): int
goto label(2)
label(2):
var(5): int = load(const(0): int): int
return var(5): int memory stack
- 000: 1 # const(1): int
memory instr
- 000: addi r3, ze, 0 # v0 = load(c1: int): int
- 004: load r3, r3 #
- 008: addi r4, ze, 0 # v1 = load(c1: int): int
- 012: load r4, r4 #
- 016: slti r5, r3, r4 # v2 = eq(v0: int, v1: int): bool
- 020: slti r6, r4, r3 # r5 is (r3 < r4), r6 is (r4 < r3)
- 024: orb r6, r5, r6 # r6 is ((r3 < r4) or (r4 < r3))
- 036: addi r6, ip, 28 # if v2 then l0 else l1 end l2
- 040: br r5, r6 #
- 044: addi r7, ze, 0 # l0: v3 = load(c1: int): int
- 048: load r7, r7 #
- 052: addi r8, ze, 1 # goto l2
- 056: addi r9, ip, 20 #
- 060: br r8, r9 #
- 064: addi rA, ze, 0 # l1: v4 = load(c1: int): int
- 068: load rA, rA #
- 072: addi r7, rA, 0 # v3 = copy(v4: int): int
- 076: addi rB, ze, ze # l2: v5 = load(c0: int): int
- 080: hlt |
Example: Procedure (def id (lambda (n int) n))
(id 5) procedure 0(var(0): int) -> int
label(0):
return var(0): int
label(main):
var(1): (int) -> int = load(const(0): (int) -> int): (int) -> int
var(2): int = load(const(5): int): int
var(3): int = invoke(var(1): (int) -> int)(var(2): int): int
var(4): int = load(const(0): int): int
return var(4): int memory stack
memory instr
- 000: addi t1, ze, 28 # v1 = load(c0: (int) -> int): (int) -> int
- 004: addi t2, ze, 5 # v2 = load(c5: int): int
- 008: addi ra, ip, 12 # return address
- 012: addi a1, t2, 0 # args[1] = t2 = v2 = c5
- 016: brn ze, t1 # TODO: "branch if not" is better to use ze register
- 020: addi t4, ze, 0 # v4 = load(c0: int): int
- 024: hlt
- 028: brn ze, ra # l0: return var(0): int |
vityaman
added a commit
that referenced
this issue
Feb 6, 2024
vityaman
added a commit
that referenced
this issue
Feb 6, 2024
vityaman
added a commit
that referenced
this issue
Feb 6, 2024
vityaman
added a commit
that referenced
this issue
Feb 6, 2024
vityaman
added a commit
that referenced
this issue
Feb 6, 2024
vityaman
added a commit
that referenced
this issue
Feb 6, 2024
vityaman
added a commit
that referenced
this issue
Feb 6, 2024
vityaman
added a commit
that referenced
this issue
Feb 7, 2024
No halt just infinity loop |
vityaman
added a commit
that referenced
this issue
Feb 9, 2024
vityaman
added a commit
that referenced
this issue
Feb 12, 2024
vityaman
added a commit
that referenced
this issue
Feb 12, 2024
vityaman
added a commit
that referenced
this issue
Feb 12, 2024
vityaman
added a commit
that referenced
this issue
Feb 12, 2024
vityaman
added a commit
that referenced
this issue
Feb 12, 2024
vityaman
added a commit
that referenced
this issue
Feb 12, 2024
vityaman
added a commit
that referenced
this issue
Feb 12, 2024
vityaman
added a commit
that referenced
this issue
Apr 10, 2024
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
No description provided.
The text was updated successfully, but these errors were encountered: