smoke_asm_d6.nx source
↩ module page · 58 lines · 1852 B
1// Drive the assembler with a manually-built byte buffer, to rule
2// out any string-literal escape weirdness in NishiLang.
3
4import "syscalls.nx"
5import "nxasm_v2.nx"
6
7func main() -> i64 {
8 let buf: *u8 = alloc(128)
9 var p: i64 = 0
10
11 // ".text\n"
12 buf[p] = 0x2E; p = p + 1 // .
13 buf[p] = 0x74; p = p + 1 // t
14 buf[p] = 0x65; p = p + 1 // e
15 buf[p] = 0x78; p = p + 1 // x
16 buf[p] = 0x74; p = p + 1 // t
17 buf[p] = 0x0A; p = p + 1 // \n
18
19 // ".globl main\n"
20 buf[p] = 0x2E; p = p + 1 // .
21 buf[p] = 0x67; p = p + 1 // g
22 buf[p] = 0x6C; p = p + 1 // l
23 buf[p] = 0x6F; p = p + 1 // o
24 buf[p] = 0x62; p = p + 1 // b (note: ".globl" = .,g,l,o,b,l in different order — typo!)
25 buf[p] = 0x6C; p = p + 1 // l
26 buf[p] = 0x20; p = p + 1 // space
27 buf[p] = 0x6D; p = p + 1 // m
28 buf[p] = 0x61; p = p + 1 // a
29 buf[p] = 0x69; p = p + 1 // i
30 buf[p] = 0x6E; p = p + 1 // n
31 buf[p] = 0x0A; p = p + 1 // \n
32
33 // "main:\n"
34 buf[p] = 0x6D; p = p + 1
35 buf[p] = 0x61; p = p + 1
36 buf[p] = 0x69; p = p + 1
37 buf[p] = 0x6E; p = p + 1
38 buf[p] = 0x3A; p = p + 1
39 buf[p] = 0x0A; p = p + 1
40
41 // "addi sp, sp, -16\n" -- copy from a literal
42 let a1: *u8 = "addi sp, sp, -16\n"
43 var k: i64 = 0
44 while a1[k] != 0 { buf[p] = a1[k]; p = p + 1; k = k + 1 }
45 let a2: *u8 = "sd ra, 8(sp)\n"
46 k = 0
47 while a2[k] != 0 { buf[p] = a2[k]; p = p + 1; k = k + 1 }
48 let a3: *u8 = "li a0, 30\n"
49 k = 0
50 while a3[k] != 0 { buf[p] = a3[k]; p = p + 1; k = k + 1 }
51 let a4: *u8 = "ret\n"
52 k = 0
53 while a4[k] != 0 { buf[p] = a4[k]; p = p + 1; k = k + 1 }
54
55 let out: *u8 = alloc(64)
56 let n: i64 = assemble(buf, p, out, 64)
57 return __syscall(93, n & 0xFF, 0, 0, 0, 0, 0)
58}