From b952210561ab64ce6af22ab53f2fd3f5d1fa0985 Mon Sep 17 00:00:00 2001 From: andromeda Date: Mon, 23 Mar 2026 17:00:32 +0100 Subject: [PATCH] add hash --- twasm/asm/main.asm | 36 +++++++++++++++++++++++++ twasm/asm/tests.asm | 65 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm index 1ed4932..7262a8f 100644 --- a/twasm/asm/main.asm +++ b/twasm/asm/main.asm @@ -1445,6 +1445,42 @@ elemb: mov rax, 1 ; return 1; dl an element of list ret +; ------------------------------------------------------------------------------ +; djb2 +; +; description: +; gets the djb2 hash of a given string +; +; parameters: +; rdi = size of string +; rsi -> start of string +; +; returned: +; rax = hash +; ------------------------------------------------------------------------------ + +djb2: + xor ecx, ecx ; rcx = index + mov rax, 5381 ; rax = hash + + .loop: + cmp rcx, rdi + jge .break + + mov rdx, rax + shl rax, 5 + add rax, rdx + + xor edx, edx + mov dl, [rsi + rcx] ; dl = current byte + add rax, rdx + + inc rcx + jmp .loop + + .break: + ret + ; ------------------------------------------------------------------------------ ; trim_trailing_whitespace ; diff --git a/twasm/asm/tests.asm b/twasm/asm/tests.asm index 5df2152..ab1cc5c 100644 --- a/twasm/asm/tests.asm +++ b/twasm/asm/tests.asm @@ -13,6 +13,9 @@ run_tests: mov rsi, .msg call print.test + call clear_test_arena + call test_djb2 + call clear_test_arena call test_elemb @@ -109,6 +112,68 @@ test_elemb: .case1 db 0x54, 0x00, 0x21, 0x20, 0x34 .msg db "test_elemb...", 0x00 +; ------------------------------------------------------------------------------ +; test_djb2 +; +; description: +; tests djb2 described functionality +; ------------------------------------------------------------------------------ + +test_djb2: + mov rsi, .msg + call print.test + + mov rsi, .case0 + mov rdi, 0 + call djb2 + cmp rax, 5381 + jne .fail + + mov rsi, .case1 + mov rdi, 1 + call djb2 + cmp rax, 177670 + jne .fail + + mov rsi, .case2 + mov rdi, 2 + call djb2 + cmp rax, 5863208 + jne .fail + + ; why am I testing this, of course it's without side effects xD + + mov rsi, .case0 + mov rdi, 0 + call djb2 + cmp rax, 5381 + jne .fail + + mov rsi, .case1 + mov rdi, 1 + call djb2 + cmp rax, 177670 + jne .fail + + mov rsi, .case2 + mov rdi, 2 + call djb2 + cmp rax, 5863208 + jne .fail + + .pass: + mov rsi, msg_pass + call print + ret + .fail: + mov rsi, msg_fail + call print + ret + .case0 db "" + .case1 db "a" + .case2 db "ab" + .msg db "test_djb2...", 0x00 + ; ------------------------------------------------------------------------------ ; test_get_tte_type ;