add some tokens, length1 token support

This commit is contained in:
andromeda
2026-03-07 21:33:28 +01:00
parent 19a3e4ff5b
commit 63e3a1ea7e
2 changed files with 109 additions and 0 deletions

View File

@@ -129,4 +129,27 @@ supported tokens are listed below
| cr3 | 0x004C | |
| cr4 | 0x004D | |
| cr8 | 0x004E | |
| hlt | 0x004F | |
| int3 | 0x0050 | |
| [ | 0x0051 | |
| ] | 0x0052 | |
| xor | 0x0053 | |
| inc | 0x0054 | |
| dec | 0x0055 | |
| mov | 0x0056 | |
| add | 0x0057 | |
| sub | 0x0058 | |
| call | 0x0059 | |
| ret | 0x005A | |
| cmp | 0x005B | |
| je | 0x005C | |
| jne | 0x005D | |
| jge | 0x005E | |
| jg | 0x005F | |
| jle | 0x0060 | |
| jl | 0x0061 | |
| + | 0x0062 | |
| - | 0x0063 | |
| * | 0x0064 | |
| / | 0x0065 | |
| | 0xFFFF | unrecognised token |

View File

@@ -47,6 +47,9 @@ start:
; ------------------------------------------------------------------------------
identify_token:
cmp rsi, 1 ; if the token has length 1
je .start_length1 ; then enter the length 1 loop
cmp rsi, 2 ; if the token has length 2
je .start_length2 ; then enter the length 2 loop
@@ -58,6 +61,26 @@ identify_token:
jmp .unrecognised ; else unrecognised
.start_length1
mov rcx, tokens.length1 ; rcx -> list of known tokens
.loop_length1
cmp rcx, tokens.length2 ; check if rcx still in the bounds of length1 tokens
jge .unrecognised ; if not, unrecognised
mov r10b, [rcx] ; known token
mov r11b, [rdi] ; token
cmp r10b, r11b ; if known token matches token
je .found_length1 ; exit loop
add rcx, 3 ; length of token + length of id
jmp .loop_length1
.found_length1
xor eax, eax ; make sure rest of rax is zeroed
mov ax, [rcx + 1] ; return id of token
ret
.start_length2
mov rcx, tokens.length2 ; rcx -> list of known tokens
@@ -496,6 +519,22 @@ test_identify_token:
mov rsi, .msg
call print
; length1 token that exists
mov byte [TEST_ARENA_ADDR], "*"
mov rdi, TEST_ARENA_ADDR
mov rsi, 1
call identify_token
cmp ax, 0x0064
jne .fail
; length1 token that doesn't exist
mov byte [TEST_ARENA_ADDR], " "
mov rdi, TEST_ARENA_ADDR
mov rsi, 1
call identify_token
cmp ax, 0xFFFF
jne .fail
; length2 token that exists
mov word [TEST_ARENA_ADDR], "sp"
mov rdi, TEST_ARENA_ADDR
@@ -575,6 +614,19 @@ test_identify_token:
; ------------------------------------------------------------------------------
tokens:
.length1
db "["
dw 0x0051
db "]"
dw 0x0052
db "+"
dw 0x0062
db "-"
dw 0x0063
db "*"
dw 0x0064
db "/"
dw 0x0065
.length2
db "r8"
dw 0x0008
@@ -624,6 +676,12 @@ tokens:
dw 0x0048
db "ss"
dw 0x0049
db "je"
dw 0x005C
db "jg"
dw 0x005F
db "jl"
dw 0x0061
.length3
db "rax"
dw 0x0000
@@ -699,6 +757,30 @@ tokens:
dw 0x004D
db "cr8"
dw 0x004E
db "hlt"
dw 0x004F
db "xor"
dw 0x0053
db "inc"
dw 0x0054
db "dec"
dw 0x0055
db "mov"
dw 0x0056
db "add"
dw 0x0057
db "sub"
dw 0x0058
db "ret"
dw 0x005A
db "cmp"
dw 0x005B
db "jne"
dw 0x005D
db "jge"
dw 0x005E
db "jle"
dw 0x0060
.length4
db "r10d"
dw 0x001A
@@ -736,6 +818,10 @@ tokens:
dw 0x003E
db "r15b"
dw 0x003F
db "int3"
dw 0x0050
db "call"
dw 0x0059
.length5
.end