diff options
Diffstat (limited to 'twasm/asm/main.asm')
| -rw-r--r-- | twasm/asm/main.asm | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm index b0e7cad..a6885be 100644 --- a/twasm/asm/main.asm +++ b/twasm/asm/main.asm @@ -470,7 +470,7 @@ tokenise: .loop: cmp rdi, rsi ; if current byte greater than last byte - jg .break ; then break + jge .break ; then break mov dl, [rdi] ; dl = current byte @@ -488,8 +488,8 @@ tokenise: push rax push rdx ; TODO probably should not ignore null bytes - mov rsi, whitespace_3 ; rsi -> list of whitespace (ignored) bytes - mov rdi, 3 ; rdi = size of list in bytes + mov rsi, whitespace_2 ; rsi -> list of whitespace (ignored) bytes + mov rdi, 2 ; rdi = size of list in bytes ; dl = current byte call elemb ; al = 0 if not whitespace, 1 if whitespace @@ -671,18 +671,32 @@ tokenise: mov rcx, rax ; rcx = evaluate_operand's return value pop rax ; rax = number of tokens processed - ; operand is a register + ; operand is some reg ; cx = token ID cmp dl, 0x00 je .operand_register + ; operand is some [reg] + ; cx = token ID + cmp dl, 0x10 + je .operand_addr_register + jmp .unexpected_operand + ; cx = token ID .operand_register: mov [TOKEN_TABLE_ADDR + rax * TOKEN_TABLE_ENTRY_SIZE], cx inc rax ; another token processed jmp .operand_break_continue + ; cx = token ID + .operand_addr_register + mov word [TOKEN_TABLE_ADDR + rax * TOKEN_TABLE_ENTRY_SIZE], 0x1000 + inc rax ; 0x1000: addr reg token, next token is the register + mov [TOKEN_TABLE_ADDR + rax * TOKEN_TABLE_ENTRY_SIZE], cx + inc rax ; the register as returned by evaluate_operand + jmp .operand_break_continue + .operand_break_continue: mov byte [.expecting], E_COMMENT | E_NEWLINE | E_WHITESPACE | E_COMMA jmp .loop @@ -833,8 +847,6 @@ evaluate_operand: mov dl, 0xFF ret - .msg db "evaluate_operand", 0x0A, 0x00 - ; ------------------------------------------------------------------------------ ; evaluate_constant ; @@ -1232,8 +1244,8 @@ trim_trailing_whitespace: push rsi mov dl, [rsi + rdi - 1] ; last element of given list - mov rsi, whitespace_3 ; pointer of whitespace list - mov rdi, 3 ; length of whitespace list + mov rsi, whitespace_2 ; pointer of whitespace list + mov rdi, 2 ; length of whitespace list call elemb pop rsi ; rsi -> start of list @@ -1553,7 +1565,7 @@ msg_halt db "halted.", 0x0A, 0x00 token_terminator_8 db 0x00, " ", 0x0A, 0x0D, ",", 0x00, 0x00, 0x00 -whitespace_3 db " ", 0x0D, 0x00 +whitespace_2 db " ", 0x0D ; test program program: @@ -1561,5 +1573,5 @@ program: db "inc rax ; inline comment", 0x0A db "; one line comment", 0x0A db "mov [rax], rdx", 0x0A - db "hlt", 0x00 ; for the sake of being able to print it, I made it a string + db "hlt" .size db $ - program |
