smoke_asm_d5.nx source
↩ module page · 39 lines · 1197 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
6import "syscalls.nx"
7import "nxasm_v2.nx"
8
9func main() -> i64 {
10 let s: *u8 = ".text\n.globl main\nmain:\naddi sp, sp, -16\nsd ra, 8(sp)\nli a0, 30\nret\n"
11 var sl: i64 = 0
12 while s[sl] != 0 { sl = sl + 1 }
13 let out: *u8 = alloc(64)
14
15 // Manually replay pass 1 to capture cur_addr.
16 let labels_raw: *u8 = alloc(32 * 256)
17 let actx_raw: *u8 = alloc(80)
18 let A: *Asm = actx_raw as *Asm
19 A.src = s
20 A.src_len = sl
21 A.pos = 0
22 A.cur_addr = 0
23 A.pass = 1
24 A.out = out
25 A.out_pos = 0
26 A.labels = labels_raw as *Label
27 A.n_labels = 0
28
29 let t_raw: *u8 = alloc(64)
30 let t: *AsmTok = t_raw as *AsmTok
31
32 let e1: i64 = assemble_pass(A, t)
33 let pass1_addr: i64 = A.cur_addr
34
35 // Encode result as a single byte: pass1_addr in high nibble,
36 // pass1_n in low nibble. Both /4 to fit (instruction count).
37 let p1: i64 = pass1_addr / 4
38 return __syscall(93, p1 & 0xFF, 0, 0, 0, 0, 0)
39}