code wiki / (root) / nxasm_v2.nx

nxasm_v2.nx

buildroot/runtime/nxasm_v2.nx

53128 B1356 linesdepth 2pulls 2 transitivereach 128 importersview sourcekind librarytopic nxasm
docsdependenciesstructsconstsfunctions

about

nxasm_v2.nx -- the Nishi RV64 assembler, with labels + directives. Complete enough to assemble the .s files nxc2 emits for small programs. Two-pass: Pass 1: walk tokens, record labels and their addresses. Pass 2: walk tokens, emit bytes to output buffer. Supports: * Mnemonics: li, mv, ret, ecall, ld, sd, add, sub, addi, jalr plus branches / jumps with label operands: j, jal, call, tail, bnez, beqz. * Directives: .text, .globl, .type, .size, .attribute, .option, .section, .asciz, .byte. First four are ignored (metadata). * Labels: `name:` at line start; referenced by jumps. Output is a raw byte buffer of code + rodata. An ELF wrapper layer (see elf_writer.nx) adds headers to make it runnable.

dependencies 1 imports · 128 importers

nx_syscalls.nx nxasm_v2.nx _offc_asm_probe.nx _offc_nxc_small.nx nx_nxasm_main.nx nx_nxc.nx nx_smoke_asm_b1.nx nx_smoke_asm_b10.nx nx_smoke_asm_b11.nx nx_smoke_asm_b12.nx nx_smoke_asm_b13.nx nx_smoke_asm_b14.nx

diagram shows first 10 each side; +0 more imports, +118 more importers in the complete lists below.

imports: nx_syscalls.nx

imported by: _offc_asm_probe.nx_offc_nxc_small.nxnx_nxasm_main.nxnx_nxc.nxnx_smoke_asm_b1.nxnx_smoke_asm_b10.nxnx_smoke_asm_b11.nxnx_smoke_asm_b12.nxnx_smoke_asm_b13.nxnx_smoke_asm_b14.nxnx_smoke_asm_b15.nxnx_smoke_asm_b16.nxnx_smoke_asm_b17.nxnx_smoke_asm_b18.nxnx_smoke_asm_b19.nxnx_smoke_asm_b2.nxnx_smoke_asm_b20.nxnx_smoke_asm_b21.nxnx_smoke_asm_b22.nxnx_smoke_asm_b3.nxnx_smoke_asm_b4.nxnx_smoke_asm_b5.nxnx_smoke_asm_b6.nxnx_smoke_asm_b7.nxnx_smoke_asm_b8.nxnx_smoke_asm_b9.nxnx_smoke_asm_d1.nxnx_smoke_asm_d2.nxnx_smoke_asm_d3.nxnx_smoke_asm_d4.nxnx_smoke_asm_d5.nxnx_smoke_asm_d6.nxnx_smoke_asm_test10.nxnx_smoke_asm_test11.nxnx_smoke_asm_test12.nxnx_smoke_asm_test13.nxnx_smoke_asm_test14.nxnx_smoke_asm_test15.nxnx_smoke_asm_test16.nxnx_smoke_asm_test17.nxnx_smoke_asm_test18.nxnx_smoke_asm_test19.nxnx_smoke_asm_test2.nxnx_smoke_asm_test20.nxnx_smoke_asm_test21.nxnx_smoke_asm_test22.nxnx_smoke_asm_test23.nxnx_smoke_asm_test24.nxnx_smoke_asm_test25.nxnx_smoke_asm_test26.nxnx_smoke_asm_test3.nxnx_smoke_asm_test4.nxnx_smoke_asm_test5.nxnx_smoke_asm_test6.nxnx_smoke_asm_test7.nxnx_smoke_asm_test8.nxnx_smoke_asm_test9.nxnx_smoke_nxasm_demo.nxnx_smoke_nxasm_demo2.nxnx_smoke_nxc_pipeline.nxnx_smoke_nxc_pipeline2.nxnx_smoke_nxc_pipeline7.nxnx_smoke_nxc_pipeline8.nxnx_smoke_nxc_pipeline9.nxnx_smoke_nxc_tilde.nxnxasm_main.nxnxc.nxsmoke_asm_b1.nxsmoke_asm_b10.nxsmoke_asm_b11.nxsmoke_asm_b12.nxsmoke_asm_b13.nxsmoke_asm_b14.nxsmoke_asm_b15.nxsmoke_asm_b16.nxsmoke_asm_b17.nxsmoke_asm_b18.nxsmoke_asm_b19.nxsmoke_asm_b2.nxsmoke_asm_b20.nxsmoke_asm_b21.nxsmoke_asm_b22.nxsmoke_asm_b3.nxsmoke_asm_b4.nxsmoke_asm_b5.nxsmoke_asm_b6.nxsmoke_asm_b7.nxsmoke_asm_b8.nxsmoke_asm_b9.nxsmoke_asm_d1.nxsmoke_asm_d2.nxsmoke_asm_d3.nxsmoke_asm_d4.nxsmoke_asm_d5.nxsmoke_asm_d6.nxsmoke_asm_test.nxsmoke_asm_test10.nxsmoke_asm_test11.nxsmoke_asm_test12.nxsmoke_asm_test13.nx +28 more (shown cap 100 declared)

structs

74struct AsmTok
306struct Label
313struct Asm

consts

354const LABELS_CAP: i64 = 8192

functions

26func enc_r(opcode: i64, funct3: i64, funct7: i64,
32func enc_i(opcode: i64, funct3: i64,
39func enc_s(opcode: i64, funct3: i64,
called by 1: parse_mem
47func enc_u(opcode: i64, rd: i64, imm20: i64) -> i64
52func enc_j(opcode: i64, rd: i64, imm: i64) -> i64
called by 1: parse_j_label
62func enc_b(opcode: i64, funct3: i64,
81func asm_is_alpha(c: i64) -> i64
called by 1: lex_one
88func asm_is_digit(c: i64) -> i64
called by 2: is_hexlex_one
92func is_hex(c: i64) -> i64
called by 1: lex_one calls 1: asm_is_digit
98func hexv(c: i64) -> i64
called by 1: lex_one
104func is_space(c: i64) -> i64
called by 1: lex_one
112func lex_one(src: *u8, pos: i64, len: i64, out: *AsmTok) -> i64
203func s_eq2(src: *u8, off: i64, len: i64, a: i64, b: i64) -> i64
209func s_eq3(src: *u8, off: i64, len: i64, a: i64, b: i64, c: i64) -> i64
216func s_eq4(src: *u8, off: i64, len: i64, a: i64, b: i64, c: i64, d: i64) -> i64
224func s_eq5(src: *u8, off: i64, len: i64, a: i64, b: i64, c: i64, d: i64, e: i64) -> i64
241func s_eq6(src: *u8, off: i64, len: i64, pat: *u8, plen: i64) -> i64
251func reg_lookup(src: *u8, off: i64, len: i64) -> i64
called by 1: expect_reg calls 3: s_eq2s_eq3s_eq4
325func label_eq(src: *u8, a_off: i64, a_len: i64,
called by 1: label_find
337func label_find(A: *Asm, name_off: i64, name_len: i64) -> i64
356func label_define(A: *Asm, name_off: i64, name_len: i64) -> i64
called by 1: assemble_pass calls 1: sys_write
375func emit_u32(A: *Asm, v: i64) -> i64
389func emit_byte(A: *Asm, v: i64) -> i64
402func next_tok(A: *Asm, t: *AsmTok) -> i64
406func expect_punct(A: *Asm, t: *AsmTok, c: i64) -> i64
412func expect_reg(A: *Asm, t: *AsmTok) -> i64
417func expect_int(A: *Asm, t: *AsmTok, err: *i64) -> i64
429func parse_rrr(A: *Asm, t: *AsmTok,
438func parse_rri(A: *Asm, t: *AsmTok, opcode: i64, funct3: i64) -> i64
448func parse_mem(A: *Asm, t: *AsmTok, is_store: i64, funct3: i64) -> i64
477func parse_li(A: *Asm, t: *AsmTok) -> i64
548func parse_mv(A: *Asm, t: *AsmTok) -> i64
563func parse_srai(A: *Asm, t: *AsmTok) -> i64
582func parse_j_label(A: *Asm, t: *AsmTok, rd: i64) -> i64
625func parse_branch_zero(A: *Asm, t: *AsmTok, funct3: i64) -> i64
641func parse_ret(A: *Asm, t: *AsmTok) -> i64 { return enc_i(0x67, 0, 0, 1, 0) }
called by 1: assemble_mnemonic calls 1: enc_i
642func parse_ecall(A: *Asm, t: *AsmTok) -> i64 { return enc_i(0x73, 0, 0, 0, 0) }
called by 1: assemble_mnemonic calls 1: enc_i
649func parse_branch(A: *Asm, t: *AsmTok, funct3: i64) -> i64
687func expect_csr_or_int(A: *Asm, t: *AsmTok, err: *i64) -> i64
728func parse_csr_full(A: *Asm, t: *AsmTok, funct3: i64) -> i64
739func parse_csrr(A: *Asm, t: *AsmTok) -> i64
749func parse_csr_write(A: *Asm, t: *AsmTok, funct3: i64) -> i64
758func parse_seqz(A: *Asm, t: *AsmTok) -> i64
766func parse_snez(A: *Asm, t: *AsmTok) -> i64
778func parse_la(A: *Asm, t: *AsmTok) -> i64
816func parse_tail(A: *Asm, t: *AsmTok) -> i64
839func handle_byte(A: *Asm, t: *AsmTok) -> i64
879func handle_skip(A: *Asm, t: *AsmTok) -> i64
called by 1: assemble_pass calls 2: expect_intemit_byte
892func handle_asciz(A: *Asm, t: *AsmTok) -> i64
called by 1: assemble_pass calls 2: next_tokemit_byte
980func handle_word(A: *Asm, t: *AsmTok) -> i64
1003func skip_to_newline(A: *Asm) -> i64
called by 1: assemble_pass
1014func assemble_mnemonic(A: *Asm, t: *AsmTok, off: i64, n: i64) -> i64
1124func alloc(size: i64) -> *u8;
called by 1: assemble
1126func assemble_pass(A: *Asm, t: *AsmTok) -> i64
1248func alloc(size: i64) -> *u8
called by 111: mainmainmainmainmainmain+105
1261func nxasm_diag_pass1(A: *Asm, src_len: i64) -> i64
called by 1: assemble calls 2: sys_writesys_mmap
1313func assemble(src: *u8, src_len: i64, out_buf: *u8, out_cap: i64) -> i64