449 lines
5.1 KiB
Plaintext
449 lines
5.1 KiB
Plaintext
@strlen.done:
|
|
# ret
|
|
c3
|
|
@strlen:
|
|
# xor eax, eax
|
|
31 c0
|
|
@strlen.loop:
|
|
# cmp byte [rdi + rax], 0
|
|
80 3c 07 00
|
|
# je .done:
|
|
0f 84 'strlen.done
|
|
# inc rax
|
|
48 ff c0
|
|
# jmp .loop
|
|
e9 'strlen.loop
|
|
|
|
|
|
@strstr.found:
|
|
# sub rdi, r13
|
|
4c 29 ef
|
|
# mov rax, rdi
|
|
48 89 f8
|
|
@strstr.done:
|
|
# pop r13
|
|
41 5d
|
|
# pop r12
|
|
41 5c
|
|
# pop rbx
|
|
5b
|
|
# ret
|
|
c3
|
|
@strstr.notfound
|
|
# xor eax, eax
|
|
31 c0
|
|
# dec rax
|
|
48 ff c8
|
|
# jmp .done
|
|
e9 'strstr.done
|
|
@strstr.next_hackstack:
|
|
# inc rdi
|
|
48 ff c7
|
|
# dec rax
|
|
48 ff c8
|
|
@strstr.loop_haystack:
|
|
# cmp rax, rcx
|
|
48 39 c8
|
|
# jb 'strstr.notfound
|
|
0f 82 'strstr.notfound
|
|
# xor ebx, ebx
|
|
31 db
|
|
@strstr.loop_needle:
|
|
# cmp rbx, rcx
|
|
48 39 cb
|
|
# je .found
|
|
0f 84 'strstr.found
|
|
# mov r12b, byte [rdx + rbx]
|
|
44 8a 24 1a
|
|
# cmp r12b, byte [rdi + rbx]
|
|
44 3a 24 1f
|
|
# jne .next_haystack
|
|
0f 85 'strstr.next_haystack
|
|
# inc rbx
|
|
48 ff c3
|
|
# jmp .loop_needle
|
|
e9 'strstr.loop_needle
|
|
|
|
@strstr:
|
|
# push rbx
|
|
53
|
|
# push r12
|
|
41 54
|
|
# push r13
|
|
41 55
|
|
# mov r13, rdi
|
|
49 89 fd
|
|
# mov rax, rsi
|
|
48 89 f0
|
|
# jmp .loop_haystack
|
|
e9 'strstr.loop_haystack
|
|
|
|
@strcmp.eq:
|
|
31 c0
|
|
c3
|
|
@strcmp:
|
|
# cmp rcx, rsi
|
|
48 39 f1
|
|
# cmovb rsi, rcx
|
|
48 0f 42 f1
|
|
# xor eax, eax
|
|
31 c0
|
|
@strcmp.loop:
|
|
# cmp rsi, rax
|
|
48 39 c6
|
|
# je .eq
|
|
0f 84 'strcmp.eq
|
|
# movzx ecx, byte [rdx + rax]
|
|
0f b6 0c 02
|
|
# cmp byte [rdi + rax, cl
|
|
38 0c 07
|
|
# inc rax
|
|
48 ff c0
|
|
# je .loop
|
|
0f 84 'strcmp.loop
|
|
# seta al
|
|
0f 97 c0
|
|
# sbb al, 0
|
|
1c 00
|
|
# ret
|
|
c3
|
|
|
|
@strfind.nf:
|
|
# xor eax, eax
|
|
31 c0
|
|
# dec rax
|
|
48 ff c8
|
|
@strfind.f:
|
|
c3
|
|
@strfind:
|
|
# xor eax, eax
|
|
31 c0
|
|
# cmp rax, rsi
|
|
48 39 f0
|
|
# jge .nf
|
|
0f 8d 'strfind.nf
|
|
# mov cl, byte [rdi + rax]
|
|
8a 0c 07
|
|
# cmp cl, dl
|
|
38 d1
|
|
# je .f
|
|
0f 84 'strfind.f
|
|
# inc rax
|
|
48 ff c0
|
|
# jmp strfind
|
|
e9 'strfind
|
|
|
|
@memcpy.done:
|
|
c3
|
|
@memcpy:
|
|
# test rdx, rdx
|
|
48 85 d2
|
|
# jz .done
|
|
0f 84 'memcpy.done
|
|
# mov al, byte [rdi]
|
|
8a 07
|
|
# mov byte [rsi], al
|
|
88 06
|
|
# inc rsi
|
|
48 ff c6
|
|
# inc rdi
|
|
48 ff c7
|
|
# dec rdx
|
|
48 ff ca
|
|
# jmp .loop
|
|
e9 'memcpy
|
|
|
|
@is_alpha:
|
|
40 0f b6 c7
|
|
25 df ff 1f 00
|
|
83 c0 bf
|
|
83 f8 1a
|
|
0f 92 c0
|
|
c3
|
|
|
|
@is_digit:
|
|
40 0f b6 ff
|
|
8d 47 d0
|
|
83 f8 0a
|
|
0f 92 c0
|
|
c3
|
|
|
|
@is_alphanumeric:
|
|
8d 47 d0
|
|
83 f8 0a
|
|
0f 92 c1
|
|
40 80 e7 df
|
|
40 80 c7 bf
|
|
40 80 ff 1a
|
|
0f 92 c0
|
|
08 c8
|
|
c3
|
|
|
|
@is_id_start:
|
|
# call is_alpha
|
|
e8 'is_alpha
|
|
40 80 ff 5f
|
|
0f 94 c1
|
|
08 c8
|
|
c3
|
|
|
|
@is_id_cont:
|
|
# call is_alphanumeric
|
|
e8 'is_alphanumeric
|
|
40 80 ff 2d
|
|
0f 94 c1
|
|
08 c8
|
|
40 80 ff 5f
|
|
0f 94 c1
|
|
08 c8
|
|
c3
|
|
|
|
@to_digit.inv:
|
|
# xor eax, eax
|
|
31 c0
|
|
# ret
|
|
c3
|
|
@to_digit:
|
|
8d 46 fe
|
|
83 f8 23
|
|
# jae .inv
|
|
0f 83 'to_digit.inv
|
|
48 0f b6 ff
|
|
8d 57 bf
|
|
83 e2 df
|
|
83 c2 0a
|
|
8d 47 d0
|
|
83 fe 0b
|
|
0f 42 d0
|
|
83 ff 3a
|
|
0f 42 d0
|
|
31 c0
|
|
39 f2
|
|
0f 92 c0
|
|
c3
|
|
|
|
@parse_i64.done:
|
|
# mov rdx, rax
|
|
48 89 c2
|
|
# neg r13
|
|
49 f7 dd
|
|
# cmp dword [rsp], 0
|
|
83 3c 24 00
|
|
# cmovl rdx, r13
|
|
49 0f 4c d5
|
|
# add rsp, 8
|
|
48 83 c4 08
|
|
# pop rdi
|
|
5f
|
|
# sub rbx, rdi
|
|
48 29 fb
|
|
# mov rax, rbx
|
|
48 89 d8
|
|
@parse_i64.epilogue:
|
|
# pop r14
|
|
41 5e
|
|
# pop r13
|
|
41 5d
|
|
# pop r12
|
|
41 5c
|
|
# pop rbx
|
|
5b
|
|
# pop rbp
|
|
5d
|
|
# ret
|
|
c3
|
|
@parse_i64.not_num:
|
|
# xor eax, eax
|
|
31 c0
|
|
# xor edx, edx
|
|
31 d2
|
|
# add rsp, 8
|
|
48 83 c4 08
|
|
# pop rdi
|
|
5f
|
|
# jmp .epilogue
|
|
e9 'parse_i64.epilogue
|
|
|
|
@parse_i64_cstr:
|
|
e8 'strlen
|
|
# mov rsi, rax
|
|
48 89 c6
|
|
|
|
@parse_i64:
|
|
# push rbp
|
|
55
|
|
# mov rbp, rsp
|
|
48 89 e5
|
|
# push rbx
|
|
53
|
|
# push r12
|
|
41 54
|
|
# push r13
|
|
41 55
|
|
# push r14
|
|
41 56
|
|
# push rdi
|
|
57
|
|
# sub rsp, 8
|
|
48 83 ec 08
|
|
# mov dword [rsp], 1
|
|
c7 04 24 01 00 00 00
|
|
# mov rbx, rdi
|
|
48 89 fb
|
|
# mov r12, 10
|
|
41 bc 0a 00 00 00
|
|
# xor r13, r13
|
|
4d 31 ed
|
|
# xor eax, eax
|
|
31 c0
|
|
# mov r14, rsi
|
|
49 89 f6
|
|
# add r14, rdi
|
|
49 01 fe
|
|
# cmp rbx, r14
|
|
4c 39 f3
|
|
# jge .done
|
|
0f 8d 'parse_i64.done
|
|
# cmp byte [rbx], '-'
|
|
80 3b 2d
|
|
# sete al
|
|
0f 94 c0
|
|
# lea rbx, [rbx + rax]
|
|
48 8d 1c 03
|
|
# shl eax, 1
|
|
d1 e0
|
|
# sub dword [rsp], eax
|
|
29 04 24
|
|
# cmp rbx, r14
|
|
4c 39 f3
|
|
# jge .done
|
|
0f 8d 'parse_i64.done
|
|
# cmp byte [rbx], '+'
|
|
80 3b 2b
|
|
# sete al
|
|
0f 94 c0
|
|
# lea rbx, [rbx + rax]
|
|
48 8d 1c 03
|
|
# cmp rbx, r14
|
|
4c 39 f3
|
|
# jge .done
|
|
0f 8d 'parse_i64.done
|
|
# mov dil, byte [rbx]
|
|
40 8a 3b
|
|
# mov esi, 10
|
|
be 0a 00 00 00
|
|
# call to_digit
|
|
e8 'to_digit
|
|
# jae .not_num
|
|
0f 83 'parse_i64.not_num
|
|
# cmp dil, '0'
|
|
40 80 ff 30
|
|
# jne .loop
|
|
0f 85 'parse_i64.loop
|
|
# inc rbx
|
|
48 ff c3
|
|
# cmp rbx, r14
|
|
4c 39 f3
|
|
# jge .done
|
|
0f 8d 'parse_i64.done
|
|
# mov dil, byte [rbx]
|
|
40 8a 3b
|
|
# and dil, 0xdf
|
|
40 80 e7 df
|
|
# cmp dil, 'X'
|
|
40 80 ff 58
|
|
# sete al
|
|
0f 94 c0
|
|
# lea ecx, [eax + eax * 2]
|
|
67 8d 0c 40
|
|
# shl ecx, 1
|
|
d1 e1
|
|
# add r12d, ecx
|
|
41 01 cc
|
|
# cmp dil, 'O'
|
|
40 80 ff 4f
|
|
# sete al
|
|
0f 94 c0
|
|
# shl al, 1
|
|
d0 e0
|
|
# sub r12d, eax
|
|
41 29 c4
|
|
# cmp dil, 'B'
|
|
40 80 ff 42
|
|
# sete al
|
|
0f 94 c0
|
|
# shl al, 3
|
|
c0 e0 03
|
|
# sub r12d, eax
|
|
41 29 c4
|
|
# cmp r12d, 10
|
|
41 83 fc 0a
|
|
# setne al
|
|
0f 95 c0
|
|
# lea rbx, [rbx + rax]
|
|
48 8d 1c 03
|
|
|
|
@parse_i64.loop:
|
|
# cmp rbx, r14
|
|
4c 39 f3
|
|
# jge .done
|
|
0f 8d 'parse_i64.done
|
|
# mov dil, byte [rbx]
|
|
40 8a 3b
|
|
# inc rbx
|
|
48 ff c3
|
|
# cmp dil, '_'
|
|
40 80 ff 5f
|
|
# je .loop
|
|
0f 84 'parse_i64.loop
|
|
# mov esi, r12d
|
|
44 89 e6
|
|
# call to_digit
|
|
e8 'to_digit
|
|
# mov ecx, edx
|
|
89 d1
|
|
# test al, al
|
|
84 c0
|
|
# je .done
|
|
0f 84 'parse_i64.done
|
|
# mov rax, r13
|
|
4c 89 e8
|
|
# imul r12
|
|
49 f7 ec
|
|
# add rax, rcx
|
|
48 01 c8
|
|
mov r13, rax
|
|
49 89 c5
|
|
# jmp .loop
|
|
e9 'parse_i64.loop
|
|
|
|
@exit:
|
|
# xor edi, edi
|
|
31 ff
|
|
# mov eax, 60
|
|
b8 3c 00 00 00
|
|
# syscall
|
|
0f 05
|
|
|
|
@fasthash.done:
|
|
c3
|
|
@fasthash:
|
|
# mov eax, 0x811c9dc5
|
|
b8 c5 9d 1c 81
|
|
@fasthash.loop:
|
|
# test rsi, rsi
|
|
48 85 f6
|
|
# jz .done
|
|
0f 84 'fasthash.done
|
|
# movzx ecx, byte [rdi]
|
|
0f b6 0f
|
|
# xor eax, ecx
|
|
31 c8
|
|
# imul eax, 0x01000193
|
|
69 c0 93 01 00 01
|
|
# inc rdi
|
|
48 ff c7
|
|
# dec rsi
|
|
48 ff ce
|
|
# jmp .loop
|
|
e9 'fasthash.loop |