Skip to content

Instantly share code, notes, and snippets.

@adventurist
Created July 7, 2020 18:55
Show Gist options
  • Save adventurist/01102f595566f1212e103d784b8b0b7d to your computer and use it in GitHub Desktop.
Save adventurist/01102f595566f1212e103d784b8b0b7d to your computer and use it in GitHub Desktop.
Decoder shared_ptr (asm)
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