from-scratch/stages/shared/lib.hex1
2026-07-14 16:36:54 +02:00

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