summaryrefslogtreecommitdiff
path: root/twasm/asm/main.asm
diff options
context:
space:
mode:
Diffstat (limited to 'twasm/asm/main.asm')
-rw-r--r--twasm/asm/main.asm72
1 files 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
@@ -1076,6 +1079,70 @@ assemble:
.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
;
; description:
@@ -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