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
|
pop rdi ; rdi = number of tokens in token table
|
||||||
call assemble
|
call assemble
|
||||||
|
|
||||||
|
mov rsi, msg_welcome
|
||||||
|
call OUTPUT_ADDR
|
||||||
|
|
||||||
jmp halt
|
jmp halt
|
||||||
|
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
@@ -941,7 +944,7 @@ assemble:
|
|||||||
call print.debug
|
call print.debug
|
||||||
pop rsi
|
pop rsi
|
||||||
mov rsp, rbp
|
mov rsp, rbp
|
||||||
ret
|
jmp resolve_awaiting_labels ; tail call
|
||||||
|
|
||||||
.unexpected_token:
|
.unexpected_token:
|
||||||
call .flush_write_buffer
|
call .flush_write_buffer
|
||||||
@@ -1075,6 +1078,70 @@ assemble:
|
|||||||
.msg_operator_2_register_const db "operator_2_register_const", 0x0A, 0x00
|
.msg_operator_2_register_const db "operator_2_register_const", 0x0A, 0x00
|
||||||
.msg_pseudo_operator db "pseudo_operator", 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
|
; get_tte_type
|
||||||
;
|
;
|
||||||
@@ -2392,7 +2459,7 @@ add_awaiting_label:
|
|||||||
mov rdx, [LABEL_TABLE_ADDR + rdi]
|
mov rdx, [LABEL_TABLE_ADDR + rdi]
|
||||||
mov [AWAITING_LABEL_TABLE_ADDR + rax], rdx ; hash
|
mov [AWAITING_LABEL_TABLE_ADDR + rax], rdx ; hash
|
||||||
mov [AWAITING_LABEL_TABLE_ADDR + 8 + rax], esi ; address
|
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
|
ret
|
||||||
|
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
@@ -3169,6 +3236,7 @@ whitespace_2 db " ", 0x0D
|
|||||||
; test program
|
; test program
|
||||||
align 128
|
align 128
|
||||||
program:
|
program:
|
||||||
|
db "ret", 0x0A
|
||||||
db "print:", 0x0A
|
db "print:", 0x0A
|
||||||
db " push rdx", 0x0A
|
db " push rdx", 0x0A
|
||||||
db " push rax", 0x0A
|
db " push rax", 0x0A
|
||||||
|
|||||||
Reference in New Issue
Block a user