code wiki / (root) / smoke_asm_d6.nx

smoke_asm_d6.nx source

↩ module page · 58 lines · 1852 B

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