add elemb, improve token checking
This commit is contained in:
@@ -9,13 +9,17 @@ TEST_ARENA_SIZE equ 0x1000 ; maximum size tests can use
|
|||||||
OUTPUT_ADDR equ 0x00070000 ; address of outputed binary
|
OUTPUT_ADDR equ 0x00070000 ; address of outputed binary
|
||||||
OUTPUT_SIZE equ 0x1000 ; max length of outputed binary
|
OUTPUT_SIZE equ 0x1000 ; max length of outputed binary
|
||||||
|
|
||||||
|
STACK_ADDR equ 0x00060000 ; address to put the 64-bit stack at
|
||||||
|
|
||||||
[bits 64]
|
[bits 64]
|
||||||
[org LOAD_ADDR]
|
[org LOAD_ADDR]
|
||||||
|
|
||||||
start:
|
start:
|
||||||
|
mov rsp, STACK_ADDR ; we might need more stack space, let's just be safe
|
||||||
|
|
||||||
mov rsi, msg_welcome
|
mov rsi, msg_welcome
|
||||||
call print
|
call print
|
||||||
|
|
||||||
call run_tests
|
call run_tests
|
||||||
|
|
||||||
jmp halt
|
jmp halt
|
||||||
@@ -41,21 +45,35 @@ start:
|
|||||||
|
|
||||||
copy_token:
|
copy_token:
|
||||||
.loop:
|
.loop:
|
||||||
mov al, [rdi] ; check if next char is a space
|
|
||||||
cmp al, " "
|
|
||||||
je .break
|
|
||||||
|
|
||||||
call copy_byte ; copy the next byte if not
|
mov dl, [rdi] ; move bit to compare to current byte in read buffer
|
||||||
|
|
||||||
inc rdi ; increment read- and write-pointers
|
push rdi ; push incrementors to call elemb
|
||||||
inc rsi
|
push rsi ;
|
||||||
jmp .loop ; and loop again
|
|
||||||
|
mov rdi, 8 ; length of terminator list
|
||||||
|
mov rsi, token_terminator_8 ; start of terminator list
|
||||||
|
; dl set before pushing rdi
|
||||||
|
call elemb
|
||||||
|
|
||||||
|
pop rsi ;
|
||||||
|
pop rdi ; pop incrementors after call
|
||||||
|
|
||||||
|
cmp rax, 1 ; check if the next character is a token terminator
|
||||||
|
je .break ; > if so, break the function
|
||||||
|
|
||||||
|
; rdi and rsi set from previous loop iteration
|
||||||
|
call copy_byte ; if not, copy the current byte in read buffer
|
||||||
|
|
||||||
|
inc rdi ; read pointer
|
||||||
|
inc rsi ; write pointer
|
||||||
|
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
.break:
|
.break:
|
||||||
mov rax, rdi ; return values
|
mov rax, rdi ; -> last byte read
|
||||||
mov rdx, rsi
|
mov rdx, rsi ; -> last byte written
|
||||||
ret
|
ret
|
||||||
.msg db "yo loop copy_token", 0x0D, 0x0A, 0x00
|
|
||||||
|
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
; copy_byte
|
; copy_byte
|
||||||
@@ -118,6 +136,48 @@ halt:
|
|||||||
hlt
|
hlt
|
||||||
jmp halt
|
jmp halt
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; elemb
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; checks if given byte is element of the specified list
|
||||||
|
;
|
||||||
|
; parameters:
|
||||||
|
; rdi = size of list
|
||||||
|
; rsi -> start of list
|
||||||
|
; dl = given byte
|
||||||
|
;
|
||||||
|
; returned:
|
||||||
|
; rax = 0: is not an element
|
||||||
|
; 1: is an element
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
elemb:
|
||||||
|
.loop
|
||||||
|
cmp rdi, 0 ; check if remaining length 0
|
||||||
|
je .not_found ; if so, break; dl not an element of list
|
||||||
|
|
||||||
|
mov al, [rsi]
|
||||||
|
cmp al, dl ; check if current byte in list is the desired byte
|
||||||
|
je .found ; if so, break; dl an element of list
|
||||||
|
|
||||||
|
inc rsi ; move to next byte
|
||||||
|
dec rdi ; and reduce remaining length
|
||||||
|
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.not_found
|
||||||
|
xor rax, rax ; return 0; dl not an element of list
|
||||||
|
ret
|
||||||
|
|
||||||
|
.found
|
||||||
|
xor rax, rax
|
||||||
|
mov rax, 1 ; return 1; dl an element of list
|
||||||
|
ret
|
||||||
|
|
||||||
|
.f db "found", 0x0D, 0x0A, 0x00
|
||||||
|
.nf db "not found", 0x0D, 0x0A, 0x00
|
||||||
|
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
; tests
|
; tests
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
@@ -135,6 +195,7 @@ run_tests:
|
|||||||
|
|
||||||
call test_copy_byte
|
call test_copy_byte
|
||||||
call test_copy_token
|
call test_copy_token
|
||||||
|
call test_elemb
|
||||||
|
|
||||||
ret
|
ret
|
||||||
.msg db "running test suite...", 0x0D, 0x0A, 0x00
|
.msg db "running test suite...", 0x0D, 0x0A, 0x00
|
||||||
@@ -143,7 +204,7 @@ run_tests:
|
|||||||
; test_copy_byte
|
; test_copy_byte
|
||||||
;
|
;
|
||||||
; description:
|
; description:
|
||||||
; tests copy_byte's described functionality
|
; tests copy_byte described functionality
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
test_copy_byte:
|
test_copy_byte:
|
||||||
@@ -183,20 +244,39 @@ test_copy_token:
|
|||||||
mov rsi, .msg
|
mov rsi, .msg
|
||||||
call print
|
call print
|
||||||
|
|
||||||
mov rdi, test_token ; read buffer
|
; test case: space terminated
|
||||||
mov rsi, TEST_ARENA_ADDR ; write buffer
|
|
||||||
|
mov rdi, test_token_space ; read buffer
|
||||||
|
mov rsi, TEST_ARENA_ADDR ; write buffer
|
||||||
call copy_token
|
call copy_token
|
||||||
|
|
||||||
; check reported final indicies with the expected final indicies
|
; check reported final indicies with the expected final indicies
|
||||||
cmp rax, test_token + 8 ; last byte read
|
cmp rax, test_token_space + 8 ; last byte read
|
||||||
jne .fail
|
jne .fail
|
||||||
cmp rdx, TEST_ARENA_ADDR + 8 ; last byte written
|
cmp rdx, TEST_ARENA_ADDR + 8 ; last byte written
|
||||||
jne .fail
|
jne .fail
|
||||||
|
|
||||||
mov rsi, TEST_ARENA_ADDR
|
mov rsi, TEST_ARENA_ADDR
|
||||||
mov rcx, [rsi]
|
mov rcx, [rsi]
|
||||||
cmp rcx, [test_token] ; compare copied token to expected token
|
cmp rcx, [test_token_space] ; check if copied token matches expected token
|
||||||
|
jne .fail ; if not, fail
|
||||||
|
|
||||||
|
; test case: null terminated
|
||||||
|
|
||||||
|
mov rdi, test_token_null ; read buffer
|
||||||
|
mov rsi, TEST_ARENA_ADDR ; write buffer
|
||||||
|
call copy_token
|
||||||
|
|
||||||
|
; check reported final indicies with the expected final indicies
|
||||||
|
cmp rax, test_token_null + 8 ; last byte read
|
||||||
jne .fail
|
jne .fail
|
||||||
|
cmp rdx, TEST_ARENA_ADDR + 8 ; last byte written
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
mov rsi, TEST_ARENA_ADDR
|
||||||
|
mov rcx, [rsi]
|
||||||
|
cmp rcx, [test_token_null] ; check if copied token matches expected token
|
||||||
|
jne .fail ; if not, fail
|
||||||
|
|
||||||
.pass:
|
.pass:
|
||||||
mov rsi, msg_pass
|
mov rsi, msg_pass
|
||||||
@@ -208,6 +288,67 @@ test_copy_token:
|
|||||||
ret
|
ret
|
||||||
.msg db "test_copy_token...", 0x00
|
.msg db "test_copy_token...", 0x00
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
; test_elemb
|
||||||
|
;
|
||||||
|
; description:
|
||||||
|
; tests elemb described functionality
|
||||||
|
; ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
test_elemb:
|
||||||
|
mov rsi, .msg
|
||||||
|
call print
|
||||||
|
|
||||||
|
; [0]
|
||||||
|
mov rdi, 5
|
||||||
|
mov rsi, test_elemb_5
|
||||||
|
mov dl, [test_elemb_5]
|
||||||
|
call elemb
|
||||||
|
cmp al, 1
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; [n - 1]
|
||||||
|
mov rdi, 5
|
||||||
|
mov rsi, test_elemb_5
|
||||||
|
mov dl, [test_elemb_5 + 4]
|
||||||
|
call elemb
|
||||||
|
cmp al, 1
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; [1]
|
||||||
|
mov rdi, 5
|
||||||
|
mov rsi, test_elemb_5
|
||||||
|
mov dl, [test_elemb_5 + 1]
|
||||||
|
call elemb
|
||||||
|
cmp al, 1
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; not present
|
||||||
|
mov rdi, 5
|
||||||
|
mov rsi, test_elemb_5
|
||||||
|
mov dl, 0xDA
|
||||||
|
call elemb
|
||||||
|
cmp al, 0
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
; 0 length list
|
||||||
|
mov rdi, 0
|
||||||
|
mov rsi, test_elemb_0
|
||||||
|
mov dl, 0x34
|
||||||
|
call elemb
|
||||||
|
cmp al, 0
|
||||||
|
jne .fail
|
||||||
|
|
||||||
|
.pass:
|
||||||
|
mov rsi, msg_pass
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
mov rsi, msg_fail
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
.msg db "test_elemb...", 0x00
|
||||||
|
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
; data
|
; data
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
@@ -217,5 +358,12 @@ msg_halt db "halted.", 0x0D, 0x0A, 0x00
|
|||||||
msg_pass db "passed.", 0x0D, 0x0A, 0x00
|
msg_pass db "passed.", 0x0D, 0x0A, 0x00
|
||||||
msg_fail db "failed.", 0x0D, 0x0A, 0x00
|
msg_fail db "failed.", 0x0D, 0x0A, 0x00
|
||||||
|
|
||||||
test_byte db "T"
|
test_byte db "Q" ; unterminated, just a byte chillin
|
||||||
test_token db "TestTokn " ; followed by space. Quad word
|
test_token_null db "TestTokn", 0x00 ; followed by null terminator. Quad word
|
||||||
|
test_token_space db "TestTokn " ; followed by space. Quad word
|
||||||
|
test_elemb_0
|
||||||
|
test_elemb_5 db 0x54, 0x00, 0x21, 0x20, 0x34
|
||||||
|
|
||||||
|
token_terminator_8 db 0x00, " ", 0x0A, 0x0D, 0x00, 0x00, 0x00, 0x00
|
||||||
|
|
||||||
|
debug_string db "debug_string", 0x0D, 0x0A, 0x00
|
||||||
|
|||||||
Reference in New Issue
Block a user