do awaiting labels, fix bug, make call not crash xd

This commit is contained in:
andromeda
2026-04-04 13:47:39 +02:00
parent 34b11aabe5
commit 0e423fa763

View File

@@ -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