; ------------------------------------------------------------------------------ ; tests ; ------------------------------------------------------------------------------ ; ------------------------------------------------------------------------------ ; run_tests ; ; description: ; runs all tests ; ------------------------------------------------------------------------------ run_tests: mov rsi, .msg call print call clear_test_arena call test_copy_byte call clear_test_arena call test_copy_token call clear_test_arena call test_elemb call clear_test_arena call test_identify_token call clear_test_arena call test_identify_next_token call clear_test_arena call test_get_tte_type call clear_test_arena call test_get_tte_typed_metadata call clear_test_arena call test_get_direct_addressing_ModRM call clear_test_arena call test_get_opcode call clear_test_arena call test_get_reg_bits ret .msg db "running test suite...", 0x0A, 0x00 ; ------------------------------------------------------------------------------ ; test_copy_byte ; ; description: ; tests copy_byte described functionality ; ------------------------------------------------------------------------------ test_copy_byte: mov rsi, .msg call print mov rdi, test_byte ; byte to be copied mov rsi, TEST_ARENA_ADDR ; location of test call copy_byte mov cx, [rsi] and ax, 0xFF ; only compare bottom byte and cx, 0xFF cmp ax, cx ; compare returned byte to copied byte jne .fail cmp al, [test_byte] ; compare returned byte to expected byte jne .fail .pass: mov rsi, msg_pass call print ret .fail: mov rsi, msg_fail call print ret .msg db "test_copy_byte...", 0x00 ; ------------------------------------------------------------------------------ ; test_copy_token ; ; description: ; tests copy_token described functionality ; ------------------------------------------------------------------------------ test_copy_token: mov rsi, .msg call print ; test case: space terminated mov rdi, test_token_space ; 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_space + 8 ; last byte read 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_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 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: mov rsi, msg_pass call print ret .fail: mov rsi, msg_fail call print ret .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 ; ------------------------------------------------------------------------------ ; test_identify_token ; ; description: ; tests identify_token described functionality ; ------------------------------------------------------------------------------ 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 mov rsi, 2 call identify_token cmp ax, 0x0026 jne .fail ; length2 token that doesn't exist mov word [TEST_ARENA_ADDR], "QQ" mov rdi, TEST_ARENA_ADDR mov rsi, 2 call identify_token cmp ax, 0xFFFF jne .fail ; length3 token that exists mov dword [TEST_ARENA_ADDR], "rax" mov rdi, TEST_ARENA_ADDR mov rsi, 3 call identify_token cmp ax, 0x0000 jne .fail ; length3 token that exists mov dword [TEST_ARENA_ADDR], "cr0" mov rdi, TEST_ARENA_ADDR mov rsi, 3 call identify_token cmp ax, 0x004A jne .fail ; length3 token that doesn't exist mov dword [TEST_ARENA_ADDR], "r16" mov rdi, TEST_ARENA_ADDR mov rsi, 3 call identify_token cmp ax, 0xFFFF jne .fail ; length4 token that exists mov dword [TEST_ARENA_ADDR], "r10d" mov rdi, TEST_ARENA_ADDR mov rsi, 4 call identify_token cmp ax, 0x001A jne .fail ; length4 token that exists mov dword [TEST_ARENA_ADDR], "r15b" mov rdi, TEST_ARENA_ADDR mov rsi, 4 call identify_token cmp ax, 0x003F jne .fail ; length4 token that doesn't exist mov dword [TEST_ARENA_ADDR], "r15q" mov rdi, TEST_ARENA_ADDR mov rsi, 4 call identify_token cmp ax, 0xFFFF jne .fail .pass: mov rsi, msg_pass call print ret .fail: mov rsi, msg_fail call print ret .msg db "test_identify_token...", 0x00 ; ------------------------------------------------------------------------------ ; test_identify_next_token ; ; description: ; tests identify_next_token described functionality ; ------------------------------------------------------------------------------ test_identify_next_token: mov rsi, .msg call print ; length1 token that exists mov word [TEST_ARENA_ADDR], "* " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0x0064 jne .fail ; length1 token that doesn't exist mov word [TEST_ARENA_ADDR], " " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0xFFFF jne .fail ; length2 token that exists mov dword [TEST_ARENA_ADDR], "sp " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0x0026 jne .fail ; length2 token that doesn't exist mov dword [TEST_ARENA_ADDR], "QQ " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0xFFFF jne .fail ; length3 token that exists mov dword [TEST_ARENA_ADDR], "rax " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0x0000 jne .fail ; length3 token that exists mov dword [TEST_ARENA_ADDR], "cr0 " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0x004A jne .fail ; length3 token that doesn't exist mov dword [TEST_ARENA_ADDR], "r16 " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0xFFFF jne .fail ; length4 token that exists mov dword [TEST_ARENA_ADDR], "r10d" mov byte [TEST_ARENA_ADDR + 4], " " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0x001A jne .fail ; length4 token that exists mov dword [TEST_ARENA_ADDR], "r15b" mov byte [TEST_ARENA_ADDR + 4], " " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0x003F jne .fail ; length4 token that doesn't exist mov dword [TEST_ARENA_ADDR], "r15q" mov byte [TEST_ARENA_ADDR + 4], " " mov rdi, TEST_ARENA_ADDR call identify_next_token cmp ax, 0xFFFF jne .fail .pass: mov rsi, msg_pass call print ret .fail: mov rsi, msg_fail call print ret .msg db "test_identify_next_token...", 0x00 ; ------------------------------------------------------------------------------ ; test_get_tte_type ; ; description: ; tests get_tte_type described functionality ; ------------------------------------------------------------------------------ test_get_tte_type: mov rsi, .msg call print mov di, 0x0053 ; xor call get_tte_type cmp al, 0x01 ; operator jne .fail mov di, 0x0003 ; rdx call get_tte_type cmp al, 0x02 ; register jne .fail mov di, 0x0056 ; mov call get_tte_type cmp al, 0x01 ; operator jne .fail mov di, 0xFFFF ; unrecognised token call get_tte_type cmp al, UNRECOGNISED_ID_TYPE jne .fail .pass: mov rsi, msg_pass call print ret .fail: mov rsi, msg_fail call print ret .msg db "test_get_tte_type...", 0x00 ; ------------------------------------------------------------------------------ ; test_get_tte_typed_metadata ; ; description: ; tests get_tte_typed_metadata described functionality ; ------------------------------------------------------------------------------ test_get_tte_typed_metadata: mov rsi, .msg call print mov di, 0x0053 ; xor call get_tte_typed_metadata cmp al, 0x02 ; # operands jne .fail mov di, 0x0003 ; rdx call get_tte_typed_metadata cmp al, 00001011b ; reg: 010b ; width: 11b (64 bits) jne .fail mov di, 0x0056 ; mov call get_tte_typed_metadata cmp al, 0x02 ; # operands jne .fail mov di, 0xFFFF ; unrecognised token call get_tte_typed_metadata cmp al, UNRECOGNISED_ID_METADATA jne .fail .pass: mov rsi, msg_pass call print ret .fail: mov rsi, msg_fail call print ret .msg db "test_get_tte_typed_metadata...", 0x00 ; ------------------------------------------------------------------------------ ; test_get_direct_addressing_ModRM ; ; description: ; tests get_direct_addressing_ModRM described functionality ; ------------------------------------------------------------------------------ test_get_direct_addressing_ModRM: mov rsi, .msg call print mov di, 0x0000 ; rax mov si, 0x0000 ; rax call get_direct_addressing_ModRM cmp al, 11000000b ; Mod Reg R/M: 11b 000b 000b jne .fail mov di, 0x0000 ; rax mov si, 0x0003 ; rdx call get_direct_addressing_ModRM cmp al, 11000010b ; Mod Reg R/M: 11b 000b 010b jne .fail mov di, 0x0003 ; rdx mov si, 0x0000 ; rax call get_direct_addressing_ModRM cmp al, 11010000b ; Mod Reg R/M: 11b 010b 000b jne .fail mov di, 0x0003 ; rdx mov si, 0x0003 ; rdx call get_direct_addressing_ModRM cmp al, 11010010b ; Mod Reg R/M 11b 010b 010b jne .fail .pass: mov rsi, msg_pass call print ret .fail: mov rsi, msg_fail call print ret .msg db "test_get_direct_addressing_ModRM...", 0x00 ; ------------------------------------------------------------------------------ ; test_get_opcode ; ; description: ; tests get_opcode described functionality ; ------------------------------------------------------------------------------ test_get_opcode: mov rsi, .msg call print mov di, 0x0053 ; xor call get_opcode cmp al, 0x31 jne .fail mov di, 0x0054 ; inc call get_opcode cmp al, 0xFF jne .fail mov di, 0x004F ; hlt call get_opcode cmp al, 0xF4 jne .fail mov di, 0x0003 ; rdx (not an operator) call get_opcode cmp al, UNRECOGNISED_ID_OPCODE jne .fail .pass: mov rsi, msg_pass call print ret .fail: mov rsi, msg_fail call print ret .msg db "test_get_opcode...", 0x00 ; ------------------------------------------------------------------------------ ; test_get_reg_bits ; ; description: ; tests get_reg_bits described functionality ; ------------------------------------------------------------------------------ test_get_reg_bits: mov rsi, .msg call print mov di, 0x0000 ; rax call get_reg_bits cmp al, 000b jne .fail mov di, 0x0010 ; eax call get_reg_bits cmp al, 000b jne .fail mov di, 0x0003 ; rdx call get_reg_bits cmp al, 010b jne .fail .pass: mov rsi, msg_pass call print ret .fail: mov rsi, msg_fail call print ret .msg db "test_get_reg_bits...", 0x00 msg_pass: db 0x0A times (TEST_LINE_LENGTH + .start - .end) db " ", ; right align .start db "passed." .end db 0x0A, 0x00 msg_fail: db 0x0A times (TEST_LINE_LENGTH + .start - .end) db " ", .start db "failed." .end db 0x0A, 0x00 test_byte db "Q" ; unterminated, just a byte chillin 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: ; [This Page Intentionally Left Blank] test_elemb_5 db 0x54, 0x00, 0x21, 0x20, 0x34