code wiki / (root) / smoke_asm_d5.nx

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}