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