nx_smoke_asm_d5.nx source
↩ module page · 45 lines · 1412 B
1// Reach into Asm to see pass 1 cur_addr vs pass 2 out_pos.
2// Returns cur_addr at end of pass 1 (before pass 2 runs)
3// minus the public 'n' from pass 2. If they match -> bug is
4// not pass-1/pass-2 divergence.
5
6// nx_safety_envelope:
7// intended_use: AUTO_APPLIED -- primitive-specific tuning queued
8// sil_target: SIL1
9// evidence: [bulk_applied_2026-05-16, see-file-comment-for-detail]
10// verdict: NOT_YET_EVALUATED
11
12import "nx_syscalls.nx"
13import "nxasm_v2.nx"
14
15func main() -> i64 {
16 let s: *u8 = ".text\n.globl main\nmain:\naddi sp, sp, -16\nsd ra, 8(sp)\nli a0, 30\nret\n"
17 var sl: i64 = 0
18 while s[sl] != 0 { sl = sl + 1 }
19 let out: *u8 = alloc(64)
20
21 // Manually replay pass 1 to capture cur_addr.
22 let labels_raw: *u8 = alloc(32 * 256)
23 let actx_raw: *u8 = alloc(80)
24 let A: *Asm = actx_raw as *Asm
25 A.src = s
26 A.src_len = sl
27 A.pos = 0
28 A.cur_addr = 0
29 A.pass = 1
30 A.out = out
31 A.out_pos = 0
32 A.labels = labels_raw as *Label
33 A.n_labels = 0
34
35 let t_raw: *u8 = alloc(64)
36 let t: *AsmTok = t_raw as *AsmTok
37
38 let e1: i64 = assemble_pass(A, t)
39 let pass1_addr: i64 = A.cur_addr
40
41 // Encode result as a single byte: pass1_addr in high nibble,
42 // pass1_n in low nibble. Both /4 to fit (instruction count).
43 let p1: i64 = pass1_addr / 4
44 return __syscall(93, p1 & 0xFF, 0, 0, 0, 0, 0)
45}