do awaiting labels, fix bug, make call not crash xd
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user