Created
July 7, 2020 18:55
-
-
Save adventurist/01102f595566f1212e103d784b8b0b7d to your computer and use it in GitHub Desktop.
Decoder shared_ptr (asm)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Link::~Link() [base object destructor]: | |
push r12 | |
mov r12, rdi | |
push rbp | |
push rbx | |
mov rbx, QWORD PTR [rdi+24] | |
test rbx, rbx | |
je .L3 | |
mov ebp, OFFSET FLAT:_ZL28__gthrw___pthread_key_createPjPFvPvE | |
lea rax, [rbx+8] | |
test rbp, rbp | |
je .L4 | |
mov edx, -1 | |
lock xadd DWORD PTR [rax], edx | |
mov eax, edx | |
.L5: | |
cmp eax, 1 | |
je .L18 | |
.L3: | |
mov rbx, QWORD PTR [r12+8] | |
test rbx, rbx | |
je .L1 | |
mov ebp, OFFSET FLAT:_ZL28__gthrw___pthread_key_createPjPFvPvE | |
lea rax, [rbx+8] | |
test rbp, rbp | |
je .L11 | |
mov edx, -1 | |
lock xadd DWORD PTR [rax], edx | |
mov eax, edx | |
.L12: | |
cmp eax, 1 | |
je .L19 | |
.L1: | |
pop rbx | |
pop rbp | |
pop r12 | |
ret | |
.L19: | |
mov rax, QWORD PTR [rbx] | |
mov rdi, rbx | |
call [QWORD PTR [rax+16]] | |
test rbp, rbp | |
lea rax, [rbx+12] | |
je .L14 | |
mov edx, -1 | |
lock xadd DWORD PTR [rax], edx | |
mov eax, edx | |
.L15: | |
cmp eax, 1 | |
jne .L1 | |
mov rax, QWORD PTR [rbx] | |
mov rdi, rbx | |
pop rbx | |
pop rbp | |
pop r12 | |
mov rax, QWORD PTR [rax+24] | |
jmp rax | |
.L18: | |
mov rax, QWORD PTR [rbx] | |
mov rdi, rbx | |
call [QWORD PTR [rax+16]] | |
test rbp, rbp | |
lea rax, [rbx+12] | |
je .L7 | |
mov edx, -1 | |
lock xadd DWORD PTR [rax], edx | |
mov eax, edx | |
.L8: | |
cmp eax, 1 | |
jne .L3 | |
mov rax, QWORD PTR [rbx] | |
mov rdi, rbx | |
call [QWORD PTR [rax+24]] | |
jmp .L3 | |
.L11: | |
mov eax, DWORD PTR [rbx+8] | |
lea edx, [rax-1] | |
mov DWORD PTR [rbx+8], edx | |
jmp .L12 | |
.L4: | |
mov eax, DWORD PTR [rbx+8] | |
lea edx, [rax-1] | |
mov DWORD PTR [rbx+8], edx | |
jmp .L5 | |
.L14: | |
mov eax, DWORD PTR [rbx+12] | |
lea edx, [rax-1] | |
mov DWORD PTR [rbx+12], edx | |
jmp .L15 | |
.L7: | |
mov eax, DWORD PTR [rbx+12] | |
lea edx, [rax-1] | |
mov DWORD PTR [rbx+12], edx | |
jmp .L8 | |
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release(): | |
push rbp | |
mov ebp, OFFSET FLAT:_ZL28__gthrw___pthread_key_createPjPFvPvE | |
lea rax, [rdi+8] | |
push rbx | |
mov rbx, rdi | |
sub rsp, 8 | |
test rbp, rbp | |
je .L21 | |
mov edx, -1 | |
lock xadd DWORD PTR [rax], edx | |
mov eax, edx | |
.L22: | |
cmp eax, 1 | |
je .L29 | |
.L20: | |
add rsp, 8 | |
pop rbx | |
pop rbp | |
ret | |
.L29: | |
mov rax, QWORD PTR [rbx] | |
mov rdi, rbx | |
call [QWORD PTR [rax+16]] | |
test rbp, rbp | |
lea rax, [rbx+12] | |
je .L25 | |
mov edx, -1 | |
lock xadd DWORD PTR [rax], edx | |
mov eax, edx | |
.L26: | |
cmp eax, 1 | |
jne .L20 | |
mov rax, QWORD PTR [rbx] | |
mov rdi, rbx | |
mov rax, QWORD PTR [rax+24] | |
add rsp, 8 | |
pop rbx | |
pop rbp | |
jmp rax | |
.L21: | |
mov eax, DWORD PTR [rdi+8] | |
lea edx, [rax-1] | |
mov DWORD PTR [rdi+8], edx | |
jmp .L22 | |
.L25: | |
mov eax, DWORD PTR [rbx+12] | |
lea edx, [rax-1] | |
mov DWORD PTR [rbx+12], edx | |
jmp .L26 | |
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_add_ref_copy(): | |
mov edx, OFFSET FLAT:_ZL28__gthrw___pthread_key_createPjPFvPvE | |
lea rax, [rdi+8] | |
test rdx, rdx | |
je .L31 | |
lock add DWORD PTR [rax], 1 | |
ret | |
.L31: | |
add DWORD PTR [rdi+8], 1 | |
ret | |
.LC0: | |
.string "vector::_M_range_insert" | |
void std::vector<unsigned char, std::allocator<unsigned char> >::_M_range_insert<unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*, unsigned char*, std::forward_iterator_tag): | |
push r15 | |
push r14 | |
push r13 | |
push r12 | |
mov r12, rdx | |
push rbp | |
push rbx | |
sub rsp, 24 | |
cmp rdx, rcx | |
je .L33 | |
mov r8, QWORD PTR [rdi+8] | |
mov rax, QWORD PTR [rdi+16] | |
mov rbp, rcx | |
sub rbp, rdx | |
mov rbx, rdi | |
mov r13, rsi | |
sub rax, r8 | |
cmp rbp, rax | |
ja .L36 | |
mov r14, r8 | |
sub r14, rsi | |
cmp rbp, r14 | |
jb .L79 | |
lea r15, [rdx+r14] | |
mov rdi, r8 | |
sub rcx, r15 | |
mov rdx, rcx | |
jne .L80 | |
.L41: | |
sub rbp, r14 | |
add rdi, rbp | |
test r14, r14 | |
mov QWORD PTR [rbx+8], rdi | |
jne .L81 | |
.L42: | |
mov rdx, r15 | |
add rdi, r14 | |
sub rdx, r12 | |
mov QWORD PTR [rbx+8], rdi | |
jne .L78 | |
.L33: | |
add rsp, 24 | |
pop rbx | |
pop rbp | |
pop r12 | |
pop r13 | |
pop r14 | |
pop r15 | |
ret | |
.L79: | |
mov r14, r8 | |
mov rdx, r8 | |
mov rax, r8 | |
sub r14, rbp | |
sub rdx, r14 | |
jne .L82 | |
.L38: | |
mov rdx, r14 | |
add rax, rbp | |
sub rdx, r13 | |
mov QWORD PTR [rbx+8], rax | |
jne .L83 | |
test rbp, rbp | |
mov rdx, rbp | |
je .L33 | |
.L78: | |
add rsp, 24 | |
mov rsi, r12 | |
mov rdi, r13 | |
pop rbx | |
pop rbp | |
pop r12 | |
pop r13 | |
pop r14 | |
pop r15 | |
jmp memmove | |
.L36: | |
mov rdx, QWORD PTR [rdi] | |
sub r8, rdx | |
mov rax, r8 | |
not rax | |
cmp rbp, rax | |
ja .L84 | |
cmp rbp, r8 | |
mov rax, r8 | |
mov r14, -1 | |
cmovnb rax, rbp | |
add r8, rax | |
jnc .L85 | |
.L44: | |
mov rdi, r14 | |
call operator new(unsigned long) | |
mov rsi, QWORD PTR [rbx] | |
mov r15, rax | |
mov rdx, rsi | |
.L45: | |
mov r8, r13 | |
xor ecx, ecx | |
sub r8, rdx | |
jne .L86 | |
.L46: | |
add rcx, r15 | |
test rbp, rbp | |
jne .L87 | |
.L47: | |
mov r12, QWORD PTR [rbx+8] | |
add rbp, rcx | |
xor eax, eax | |
sub r12, r13 | |
jne .L88 | |
.L48: | |
mov rdi, QWORD PTR [rbx] | |
add rbp, rax | |
test rdi, rdi | |
je .L49 | |
call operator delete(void*) | |
.L49: | |
add r14, r15 | |
mov QWORD PTR [rbx], r15 | |
mov QWORD PTR [rbx+8], rbp | |
mov QWORD PTR [rbx+16], r14 | |
add rsp, 24 | |
pop rbx | |
pop rbp | |
pop r12 | |
pop r13 | |
pop r14 | |
pop r15 | |
ret | |
.L83: | |
mov rdi, r8 | |
mov rsi, r13 | |
sub rdi, rdx | |
call memmove | |
test rbp, rbp | |
mov rdx, rbp | |
je .L33 | |
jmp .L78 | |
.L85: | |
test r8, r8 | |
jne .L89 | |
mov rsi, rdx | |
xor r14d, r14d | |
xor r15d, r15d | |
jmp .L45 | |
.L80: | |
mov rsi, r15 | |
call memmove | |
mov rdi, QWORD PTR [rbx+8] | |
jmp .L41 | |
.L82: | |
mov rdi, r8 | |
mov rsi, r14 | |
call memmove | |
mov r8, rax | |
mov rax, QWORD PTR [rbx+8] | |
jmp .L38 | |
.L81: | |
mov rdx, r14 | |
mov rsi, r13 | |
call memmove | |
mov rdi, QWORD PTR [rbx+8] | |
jmp .L42 | |
.L88: | |
mov rdx, r12 | |
mov rsi, r13 | |
mov rdi, rbp | |
call memmove | |
mov rax, r12 | |
jmp .L48 | |
.L87: | |
mov rdi, rcx | |
mov rdx, rbp | |
mov rsi, r12 | |
call memmove | |
mov rcx, rax | |
jmp .L47 | |
.L86: | |
mov rdx, r8 | |
mov rdi, r15 | |
mov QWORD PTR [rsp+8], r8 | |
call memmove | |
mov r8, QWORD PTR [rsp+8] | |
mov rcx, r8 | |
jmp .L46 | |
.L84: | |
mov edi, OFFSET FLAT:.LC0 | |
call std::__throw_length_error(char const*) | |
.L89: | |
mov r14, r8 | |
jmp .L44 | |
Link::process(bool): | |
push r14 | |
push r13 | |
push r12 | |
push rbp | |
push rbx | |
sub rsp, 16 | |
test sil, sil | |
jne .L113 | |
mov rbx, QWORD PTR [rdi] | |
mov rbp, QWORD PTR [rbx+8] | |
mov rax, QWORD PTR [rbx+16] | |
sub rax, rbp | |
cmp rax, 3 | |
jbe .L93 | |
mov rdi, rbp | |
mov edx, 4 | |
mov esi, OFFSET FLAT:small_data | |
call memmove | |
add QWORD PTR [rbx+8], 4 | |
add rsp, 16 | |
pop rbx | |
pop rbp | |
pop r12 | |
pop r13 | |
pop r14 | |
ret | |
.L113: | |
mov rdi, QWORD PTR [rdi] | |
mov ecx, OFFSET FLAT:big_data+10 | |
mov edx, OFFSET FLAT:big_data | |
mov rsi, QWORD PTR [rdi+8] | |
mov BYTE PTR [rsp], 0 | |
call void std::vector<unsigned char, std::allocator<unsigned char> >::_M_range_insert<unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*, unsigned char*, std::forward_iterator_tag) | |
add rsp, 16 | |
pop rbx | |
pop rbp | |
pop r12 | |
pop r13 | |
pop r14 | |
ret | |
.L93: | |
mov rsi, QWORD PTR [rbx] | |
mov rdx, rbp | |
sub rdx, rsi | |
cmp rdx, -5 | |
ja .L114 | |
cmp rdx, 4 | |
mov eax, 4 | |
mov r13, -1 | |
cmovnb rax, rdx | |
add rax, rdx | |
jnc .L115 | |
.L96: | |
mov rdi, r13 | |
call operator new(unsigned long) | |
mov rsi, QWORD PTR [rbx] | |
mov rdx, rbp | |
mov r12, rax | |
sub rdx, rsi | |
mov r14, rdx | |
.L97: | |
test rdx, rdx | |
jne .L116 | |
.L98: | |
lea rcx, [r12+r14] | |
mov edx, 4 | |
mov esi, OFFSET FLAT:small_data | |
mov rdi, rcx | |
call memmove | |
mov r14, QWORD PTR [rbx+8] | |
mov rcx, rax | |
xor eax, eax | |
add rcx, 4 | |
sub r14, rbp | |
jne .L117 | |
.L99: | |
mov rdi, QWORD PTR [rbx] | |
lea rbp, [rcx+rax] | |
test rdi, rdi | |
je .L100 | |
call operator delete(void*) | |
.L100: | |
mov QWORD PTR [rbx], r12 | |
add r12, r13 | |
mov QWORD PTR [rbx+8], rbp | |
mov QWORD PTR [rbx+16], r12 | |
add rsp, 16 | |
pop rbx | |
pop rbp | |
pop r12 | |
pop r13 | |
pop r14 | |
ret | |
.L115: | |
test rax, rax | |
jne .L118 | |
mov r14, rdx | |
xor r13d, r13d | |
xor r12d, r12d | |
jmp .L97 | |
.L116: | |
mov rdx, r14 | |
mov rdi, r12 | |
call memmove | |
jmp .L98 | |
.L117: | |
mov rdi, rcx | |
mov rdx, r14 | |
mov rsi, rbp | |
call memmove | |
mov rcx, rax | |
mov rax, r14 | |
jmp .L99 | |
.L114: | |
mov edi, OFFSET FLAT:.LC0 | |
call std::__throw_length_error(char const*) | |
.L118: | |
mov r13, rax | |
jmp .L96 | |
main: | |
push r12 | |
pxor xmm0, xmm0 | |
push rbp | |
push rbx | |
sub rsp, 32 | |
mov rbx, QWORD PTR ds:0 | |
mov rax, QWORD PTR ds:16 | |
movdqa XMMWORD PTR [rsp], xmm0 | |
sub rax, rbx | |
cmp rax, 4989 | |
movdqa XMMWORD PTR [rsp+16], xmm0 | |
jbe .L161 | |
.L120: | |
mov rbx, QWORD PTR [rsp+24] | |
mov rbp, QWORD PTR [rsp+16] | |
test rbx, rbx | |
je .L123 | |
mov rdi, rbx | |
call std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_add_ref_copy() | |
cmp rbx, QWORD PTR [rsp+8] | |
mov QWORD PTR [rsp], rbp | |
je .L125 | |
mov rdi, rbx | |
call std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_add_ref_copy() | |
mov rdi, QWORD PTR [rsp+8] | |
test rdi, rdi | |
je .L126 | |
.L134: | |
call std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() | |
.L126: | |
mov QWORD PTR [rsp+8], rbx | |
.L125: | |
test rbx, rbx | |
je .L127 | |
mov rdi, rbx | |
call std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() | |
.L127: | |
xor esi, esi | |
mov rdi, rsp | |
call Link::process(bool) | |
xor esi, esi | |
mov rdi, rsp | |
call Link::process(bool) | |
xor esi, esi | |
mov rdi, rsp | |
call Link::process(bool) | |
xor esi, esi | |
mov rdi, rsp | |
call Link::process(bool) | |
xor esi, esi | |
mov rdi, rsp | |
call Link::process(bool) | |
mov esi, 1 | |
mov rdi, rsp | |
call Link::process(bool) | |
mov rdi, rsp | |
call Link::~Link() [complete object destructor] | |
add rsp, 32 | |
xor eax, eax | |
pop rbx | |
pop rbp | |
pop r12 | |
ret | |
.L161: | |
mov rbp, QWORD PTR ds:8 | |
mov edi, 4990 | |
sub rbp, rbx | |
call operator new(unsigned long) | |
test rbp, rbp | |
mov r12, rax | |
je .L121 | |
mov rdx, rbp | |
mov rsi, rbx | |
mov rdi, rax | |
call memmove | |
.L121: | |
mov rdi, QWORD PTR ds:0 | |
test rdi, rdi | |
je .L122 | |
call operator delete(void*) | |
.L122: | |
add rbp, r12 | |
mov QWORD PTR ds:0, r12 | |
add r12, 4990 | |
mov QWORD PTR ds:8, rbp | |
mov QWORD PTR ds:16, r12 | |
jmp .L120 | |
mov rdi, QWORD PTR [rsp+24] | |
mov rbx, rax | |
test rdi, rdi | |
je .L130 | |
call std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() | |
.L130: | |
mov rdi, QWORD PTR [rsp+8] | |
test rdi, rdi | |
je .L160 | |
call std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() | |
.L160: | |
mov rdi, rbx | |
call _Unwind_Resume | |
mov rdi, rsp | |
mov rbx, rax | |
call Link::~Link() [complete object destructor] | |
jmp .L160 | |
.L123: | |
cmp QWORD PTR [rsp+8], 0 | |
mov QWORD PTR [rsp], rbp | |
je .L127 | |
mov rdi, QWORD PTR [rsp+8] | |
jmp .L134 | |
small_data: | |
.byte 4 | |
.zero 4 | |
big_data: | |
.byte 5 | |
.zero 9 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment