-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathget.asm
100 lines (72 loc) · 1.43 KB
/
get.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
default rel
extern HashingFunction
global HashTable_get
section .text
;DESTRUCT : RAX, RBX, RSI, RDI
mstrcmp:
;rsi = string1
;rdi = string2
cmp_loop:
mov rax, [rsi]
mov rbx, [rdi]
add rsi, 8
add rdi, 8
sub rax, rbx
cmp rax, 0
jne return_cmp
mov al, BYTE [rsi]
mov bl, BYTE [rdi]
cmp al, 0
jne rsi_not_zero
movzx rax, bl
ret
rsi_not_zero:
cmp bl, 0
jne cmp_loop
movzx rax, al
ret
return_cmp:
ret
; rdi = hash_table ptr
; rsi = const char* key
HashTable_get:
push rbx
mov r8, rdi ; r8 = hash_table ptr
mov r9, rsi ; r9 = char ptr
mov rdi, r9
call HashingFunction ; rax = hash
mov rcx, [r8] ; rcx = capacity
xor rdx, rdx
div rcx
mov rax, rdx
shl rax, 0x6
add rax, QWORD [r8 + 0x10] ; rax = curr bucket
mov r10, rax ; r10 = curr bucket
mov r11, [r10 + 0x18] ; r11 = curr size
xor rcx, rcx ; rcx = counter
get_loop:
cmp r11, rcx
jbe return_null
mov rsi, r9
mov rax, [r10] ; curr bucket
mov rbx, rcx
shl rbx, 0x5
add rax, rbx
mov rdi, [rax]
call mstrcmp
cmp rax, 0x0
je return_ptr
inc rcx
jmp get_loop
return_ptr:
mov rax, [r10] ; curr bucket
mov rbx, rcx
shl rbx, 0x5
add rax, rbx
add rax, 0x8
pop rbx
ret
return_null:
xor rax, rax
pop rbx
ret