From 0e423fa76340dec2634d6e8b7081f987f6b16935 Mon Sep 17 00:00:00 2001 From: andromeda Date: Sat, 4 Apr 2026 13:47:39 +0200 Subject: [PATCH] do awaiting labels, fix bug, make call not crash xd --- twasm/asm/main.asm | 72 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm index 75a7c33..a0b267e 100644 --- a/twasm/asm/main.asm +++ b/twasm/asm/main.asm @@ -63,6 +63,9 @@ start: pop rdi ; rdi = number of tokens in token table call assemble + mov rsi, msg_welcome + call OUTPUT_ADDR + jmp halt ; ------------------------------------------------------------------------------ @@ -941,7 +944,7 @@ assemble: call print.debug pop rsi mov rsp, rbp - ret + jmp resolve_awaiting_labels ; tail call .unexpected_token: call .flush_write_buffer @@ -1075,6 +1078,70 @@ assemble: .msg_operator_2_register_const db "operator_2_register_const", 0x0A, 0x00 .msg_pseudo_operator db "pseudo_operator", 0x0A, 0x00 +; ------------------------------------------------------------------------------ +; resolve_awaiting_labels +; +; description: +; resolves placeholder references in the program at OUTPUT_ADDR using the +; label table and awaiting label table +; ------------------------------------------------------------------------------ + +resolve_awaiting_labels: + mov rbp, rsp + xor eax, eax + .loop: + shl rax, 4 + mov rdi, [AWAITING_LABEL_TABLE_ADDR + rax] + ; rdi = raxth hash in awaiting label table + + cmp rdi, 0 + je .break + + mov rsi, .msg + call print.warn + + push rax + ; rdi = raxth hash in awaiting label table + call add_label_hash + ; rax = index in label table + shl rax, 4 + mov edi, [LABEL_TABLE_ADDR + rax + 8] ; edi = address of label + pop rax ; rax = count + + mov esi, [AWAITING_LABEL_TABLE_ADDR + rax + 8] ; esi = address of reference + + sub edi, esi ; edi = offset + ; TODO fix this off-by-one error + dec edi + ; also sub length of reference TODO handle non-4-length refs + sub edi, 4 + + mov dl, [AWAITING_LABEL_TABLE_ADDR + rax + 12] ; dl = flags + + ; make sure it's 4 byte reference + push rdx + and dl, 0x0F + cmp dl, 4 + pop rdx + jne .break + + ; make sure it's relative reference + push rdx + and dl, 0x10 + cmp dl, 0x00 + pop rdx + jne .break + + mov [OUTPUT_ADDR + 1 + rsi], edi + + shr rax, 4 + inc rax + jmp .loop + .break: + mov rsp, rbp + ret + .msg db "resolve_awaiting_labels", 0x0A, 0x00 + ; ------------------------------------------------------------------------------ ; get_tte_type ; @@ -2392,7 +2459,7 @@ add_awaiting_label: mov rdx, [LABEL_TABLE_ADDR + rdi] mov [AWAITING_LABEL_TABLE_ADDR + rax], rdx ; hash mov [AWAITING_LABEL_TABLE_ADDR + 8 + rax], esi ; address - mov [AWAITING_LABEL_TABLE_ADDR + 13 + rax], cl ; bits passed to al + mov [AWAITING_LABEL_TABLE_ADDR + 12 + rax], cl ; bits passed to al ret ; ------------------------------------------------------------------------------ @@ -3169,6 +3236,7 @@ whitespace_2 db " ", 0x0D ; test program align 128 program: + db "ret", 0x0A db "print:", 0x0A db " push rdx", 0x0A db " push rax", 0x0A