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.asm25
1 files changed, 24 insertions, 1 deletions
diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm
index 8b2d7ef..9c8d483 100644
--- a/twasm/asm/main.asm
+++ b/twasm/asm/main.asm
@@ -635,6 +635,10 @@ tokenise:
test byte [.expecting], E_OPERAND ; make sure an operand was expected
jz .unexpected_operand ; if not, error
+ push rax
+ push rdi
+ xor eax, eax ; rax = length of operand
+
.operand_loop:
mov dl, [rdi]
@@ -645,10 +649,29 @@ tokenise:
cmp dl, 0x00
je .operand_break
- inc rdi
+ inc rax ; inc length counter
+ inc rdi ; inc byte pointer
jmp .operand_loop
.operand_break:
+ pop rdi ; rdi = first byte of operand
+ push rdi
+ push rsi
+ mov rsi, rax ; rsi = length of operand in bytes
+
+ mov cx, ax ; cx = length counter for safe keeping
+ call evaluate_operand
+ ; ax = register's token ID
+
+ pop rsi
+ pop rdi ; rdi = first byte of operand
+ add di, cx ; rdi = last byte of operand
+ mov cx, ax ; cx = register's token ID for safe keeping
+ pop rax ; rax = number of tokens processed
+
+ mov [TOKEN_TABLE_ADDR + rax * TOKEN_TABLE_ENTRY_SIZE], cx
+ inc rax ; another token processed
+
mov byte [.expecting], E_COMMENT | E_NEWLINE | E_WHITESPACE | E_COMMA
jmp .loop