code wiki / (root) / nx_smoke_asm_d5.nx

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}