; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/assume @ 0x4565b0 */ | #include | | uint16_t rotate_left16 (uint16_t value, uint32_t count) { | const uint16_t mask = (CHAR_BIT * sizeof (value)) - 1; | count &= mask; | return (value << count) | (value >> (-count & mask)); | } | ; (fcn) method.BloombergLP::balber::BerUtil_TimeImpUtil.putCompactBinaryTimeTzValue_std::__1::basic_streambuf_char__std::__1::char_traits_char_____BloombergLP::bdlt::TimeTz_const__BloombergLP::balber::BerEncoderOptions_const_ () | int64_t method_BloombergLP::balber::BerUtil_TimeImpUtil_putCompactBinaryTimeTzValue_std::_1::basic_streambuf_char_std::_1::char_traits_char_BloombergLP::bdlt::TimeTz_const_BloombergLP::balber::BerEncoderOptions_const_ (int64_t arg2, int64_t arg1) { | signed int64_t var_8h; | int64_t var_10h; | rsi = arg2; | rdi = arg1; | /* BloombergLP::balber::BerUtil_TimeImpUtil::putCompactBinaryTimeTzValue(std::__1::basic_streambuf >*, BloombergLP::bdlt::TimeTz const&, BloombergLP::balber::BerEncoderOptions const*) */ 0x004565b0 push rbp | 0x004565b1 push r15 | 0x004565b3 push r14 | 0x004565b5 push r13 | 0x004565b7 push r12 | 0x004565b9 push rbx | 0x004565ba sub rsp, 0x18 | 0x004565be mov rbp, rsi | 0x004565c1 mov r12, rdi | r12 = rdi; 0x004565c4 movabs r14, 0xffffffbfffffffff | r14 = 0xffffffbfffffffff; 0x004565ce movabs rbx, 0x4000000000 | rbx = 0x4000000000; 0x004565d8 mov rcx, qword [rsi] | rcx = *(rsi); 0x004565db mov qword [rsp + 0x10], rcx | *((rsp + 0x10)) = rcx; 0x004565e0 cmp rcx, rbx | | if (rcx < rbx) { 0x004565e3 jl 0x4568dc | goto label_4; | } 0x004565e9 and rcx, r14 | rcx &= r14; | label_2: 0x004565ec mov rax, rcx | rax = rcx; 0x004565ef or rax, rbx | rax |= rbx; 0x004565f2 mov qword [rsp + 0x10], rax | *((rsp + 0x10)) = rax; 0x004565f7 mov r15d, dword [rbp + 8] | r15d = *((rbp + 8)); 0x004565fb test r15d, r15d | | if (r15d != 0) { 0x004565fe je 0x456697 | 0x00456604 mov dword [rsp], 0 | *(rsp) = 0; 0x0045660b mov qword [rsp + 8], 0 | *((rsp + 8)) = 0; 0x00456614 cmp rax, rbx | | if (rax < rbx) { 0x00456617 jl 0x4568ee | goto label_5; | } 0x0045661d and rcx, r14 | rcx &= r14; | label_3: 0x00456620 movabs rdx, 0x32e73fb956a1b897 | rdx = 0x32e73fb956a1b897; 0x0045662a mov rax, rcx | rax = rcx; 0x0045662d imul rdx | rdx:rax = rax * rdx; 0x00456630 mov rax, rdx | rax = rdx; 0x00456633 shr rax, 0x3f | rax >>= 0x3f; 0x00456637 sar rdx, 0x22 | rdx >>= 0x22; 0x0045663b add rdx, rax | rdx += rax; 0x0045663e movabs rax, 0x141dd76000 | rax = 0x141dd76000; 0x00456648 imul rax, rdx | rax *= rdx; 0x0045664c sub rcx, rax | rcx -= rax; 0x0045664f mov rdi, rsp | 0x00456652 xor esi, esi | 0x00456654 mov rdx, rcx | 0x00456657 call 0x464250 | BloombergLP::bdlt::DatetimeInterval::assign(long long,long long) (rsp, 0, rcx); 0x0045665c imul ecx, dword [rsp], 0x5265c00 | ecx = *(rsp) * 0x5265c00; 0x00456663 movabs rax, 0x20c49ba5e353f7cf | rax = 0x20c49ba5e353f7cf; 0x0045666d imul qword [rsp + 8] | rdx:rax = rax * *((rsp + 8)); 0x00456672 mov rbp, rdx | 0x00456675 mov rax, rdx | rax = rdx; 0x00456678 shr rax, 0x3f | rax >>= 0x3f; 0x0045667c shr rbp, 7 | rbp >>= 7; 0x00456680 add ebp, eax | ebp += eax; 0x00456682 add ebp, ecx | ebp += ecx; | if (ebp != 0) { 0x00456684 je 0x4566ac | 0x00456686 mov eax, ebp | eax = ebp; 0x00456688 test ebp, ebp | | if (ebp <= 0) { 0x0045668a jle 0x4566b3 | goto label_6; | } 0x0045668c or eax, 1 | eax |= 1; 0x0045668f bsr eax, eax | __asm ("bsr eax, eax"); 0x00456692 xor eax, 0x1f | eax ^= 0x1f; 0x00456695 jmp 0x4566c8 | | } else { 0x00456697 lea rsi, [rsp + 0x10] | 0x0045669c mov rdi, r12 | 0x0045669f call 0x455f20 | eax = BloombergLP::balber::BerUtil_TimeImpUtil::putCompactBinaryTimeValue(std::_1::basic_streambuf>*,BloombergLP::bdlt::Timeconst&,BloombergLP::balber::BerEncoderOptionsconst*) (r12, rsp + 0x10); 0x004566a4 mov r13d, eax | r13d = eax; 0x004566a7 jmp 0x4568ca | goto label_7; | } 0x004566ac mov ebx, 1 | ebx = 1; 0x004566b1 jmp 0x4566e3 | goto label_8; | label_6: 0x004566b3 not eax | eax = ~eax; 0x004566b5 or eax, 1 | eax |= 1; 0x004566b8 bsr ecx, eax | __asm ("bsr ecx, eax"); 0x004566bb xor ecx, 0x1f | ecx ^= 0x1f; 0x004566be xor eax, eax | eax = 0; 0x004566c0 cmp ebp, 0xffffffff | 0x004566c3 sete al | al = (ebp == 0xffffffff) ? 1 : 0; 0x004566c6 add eax, ecx | eax += ecx; | } 0x004566c8 mov ecx, 0x28 | ecx = 0x28; 0x004566cd sub ecx, eax | ecx -= eax; 0x004566cf mov ebx, 0x2f | ebx = 0x2f; 0x004566d4 sub ebx, eax | ebx -= eax; 0x004566d6 test ecx, ecx | 0x004566d8 cmovns ebx, ecx | __asm ("cmovns ebx, ecx"); 0x004566db sar ebx, 3 | ebx >>= 3; 0x004566de cmp eax, 0x11 | | if (eax >= 0x11) { 0x004566e1 jl 0x456704 | | label_8: 0x004566e3 mov rax, qword [r12 + 0x30] | rax = *((r12 + 0x30)); 0x004566e8 cmp rax, qword [r12 + 0x38] | | if (rax == *((r12 + 0x38))) { 0x004566ed je 0x4567a6 | goto label_9; | } 0x004566f3 lea rcx, [rax + 1] | rcx = rax + 1; 0x004566f7 mov qword [r12 + 0x30], rcx | *((r12 + 0x30)) = rcx; 0x004566fc mov byte [rax], 5 | *(rax) = 5; 0x004566ff jmp 0x4567c4 | goto label_10; | } 0x00456704 lea esi, [rbx + 2] | 0x00456707 mov rdi, r12 | 0x0045670a call 0x453df0 | eax = BloombergLP::balber::BerUtil_LengthImpUtil::putLength(std::_1::basic_streambuf>*,int) (r12, rbx + 2); 0x0045670f mov r13d, 0xffffffff | r13d = 0xffffffff; 0x00456715 test eax, eax | | if (eax != 0) { 0x00456717 jne 0x4568ca | goto label_7; | } 0x0045671d rol r15w, 8 | r15w = rotate_left16 (r15w, 8); 0x00456722 mov word [rsp], r15w | 0x00456727 mov rax, qword [r12] | rax = *(r12); 0x0045672b mov rsi, rsp | rsi = rsp; 0x0045672e mov edx, 2 | edx = 2; 0x00456733 mov rdi, r12 | rdi = r12; 0x00456736 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (r15w); 0x00456739 cmp rax, 2 | | if (rax != 2) { 0x0045673d jne 0x4568ca | goto label_7; | } 0x00456743 mov dword [rsp], ebp | *(rsp) = ebp; 0x00456746 mov r13d, 0xffffffff | r13d = 0xffffffff; 0x0045674c cmp ebx, 4 | | if (ebx > 4) { 0x0045674f ja 0x4568ca | goto label_7; | } 0x00456755 mov ebp, ebx | 0x00456757 jmp 0x45677a | | while (rcx != *((r12 + 0x38))) { 0x00456760 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x00456764 mov qword [r12 + 0x30], rdx | *((r12 + 0x30)) = rdx; 0x00456769 mov byte [rcx], al | *(rcx) = al; | label_0: 0x0045676b dec rbp | rbp--; 0x0045676e lea eax, [rbp + 1] | eax = rbp + 1; 0x00456771 cmp eax, 1 | | if (eax <= 1) { 0x00456774 jle 0x4568c7 | goto label_11; | } 0x0045677a movzx eax, byte [rsp + rbp - 1] | eax = *((rsp + rbp - 1)); 0x0045677f mov rcx, qword [r12 + 0x30] | rcx = *((r12 + 0x30)); 0x00456784 cmp rcx, qword [r12 + 0x38] | 0x00456789 jne 0x456760 | | } 0x0045678b movzx r14d, al | r14d = (int32_t) al; 0x0045678f mov rax, qword [r12] | rax = *(r12); 0x00456793 mov rdi, r12 | rdi = r12; 0x00456796 mov esi, r14d | esi = r14d; 0x00456799 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x0045679c cmp eax, r14d | | if (eax == r14d) { 0x0045679f je 0x45676b | goto label_0; | } 0x004567a1 jmp 0x4568ca | goto label_7; | label_9: 0x004567a6 mov rax, qword [r12] | rax = *(r12); 0x004567aa mov rdi, r12 | rdi = r12; 0x004567ad mov esi, 5 | esi = 5; 0x004567b2 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x004567b5 mov r13d, 0xffffffff | r13d = 0xffffffff; 0x004567bb cmp eax, 5 | | if (eax != 5) { 0x004567be jne 0x4568ca | goto label_7; | } | label_10: 0x004567c4 rol r15w, 8 | r15w = rotate_left16 (r15w, 8); 0x004567c9 mov word [rsp], r15w | 0x004567ce mov rax, qword [r12] | rax = *(r12); 0x004567d2 mov rsi, rsp | rsi = rsp; 0x004567d5 mov edx, 2 | edx = 2; 0x004567da mov rdi, r12 | rdi = r12; 0x004567dd call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (r15w); 0x004567e0 mov r13d, 0xffffffff | r13d = 0xffffffff; 0x004567e6 cmp rax, 2 | | if (rax != 2) { 0x004567ea jne 0x4568ca | goto label_7; | } 0x004567f0 mov r14d, 3 | r14d = 3; 0x004567f6 sub r14d, ebx | r14d -= ebx; 0x004567f9 mov r13d, r14d | r13d = r14d; 0x004567fc shr r13d, 4 | r13d >>= 4; 0x00456800 mov edx, r14d | 0x00456803 mov rdi, rsp | 0x00456806 xor esi, esi | 0x00456808 call 0x4041f0 | memset (rsp, 0, r14d); 0x0045680d test r13d, r13d | | if (r13d == 0) { 0x00456810 je 0x456841 | goto label_12; | } 0x00456812 mov r15, rsp | r15 = rsp; 0x00456815 nop word cs:[rax + rax] | 0x0045681f nop | | do { 0x00456820 mov rax, qword [r12] | rax = *(r12); 0x00456824 mov edx, 0x10 | edx = 0x10; 0x00456829 mov rdi, r12 | rdi = r12; 0x0045682c mov rsi, r15 | rsi = r15; 0x0045682f call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x00456832 cmp rax, 0x10 | | if (rax != 0x10) { 0x00456836 jne 0x4568bf | goto label_13; | } 0x0045683c dec r13d | r13d--; 0x0045683f jne 0x456820 | | } while (r13d != 0); | label_12: 0x00456841 and r14d, 0xf | r14d &= 0xf; 0x00456845 mov r15d, r14d | r15d = r14d; 0x00456848 mov rax, qword [r12] | rax = *(r12); 0x0045684c mov rsi, rsp | rsi = rsp; 0x0045684f mov rdi, r12 | rdi = r12; 0x00456852 mov rdx, r15 | rdx = r15; 0x00456855 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x00456858 cmp rax, r15 | 0x0045685b mov r13d, 0xffffffff | r13d = 0xffffffff; | if (rax != r15) { 0x00456861 jne 0x4568ca | goto label_7; | } 0x00456863 mov dword [rsp], ebp | *(rsp) = ebp; 0x00456866 mov r13d, 0xffffffff | r13d = 0xffffffff; 0x0045686c test ebx, ebx | | if (ebx <= 0) { 0x0045686e jle 0x4568ca | goto label_7; | } 0x00456870 cmp ebx, 4 | | if (ebx > 4) { 0x00456873 ja 0x4568ca | goto label_7; | } 0x00456875 mov ebp, ebx | 0x00456877 jmp 0x456896 | | while (rcx != *((r12 + 0x38))) { 0x00456880 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x00456884 mov qword [r12 + 0x30], rdx | *((r12 + 0x30)) = rdx; 0x00456889 mov byte [rcx], al | *(rcx) = al; | label_1: 0x0045688b dec rbp | rbp--; 0x0045688e lea eax, [rbp + 1] | eax = rbp + 1; 0x00456891 cmp eax, 1 | | if (eax <= 1) { 0x00456894 jle 0x4568c7 | goto label_11; | } 0x00456896 movzx eax, byte [rsp + rbp - 1] | eax = *((rsp + rbp - 1)); 0x0045689b mov rcx, qword [r12 + 0x30] | rcx = *((r12 + 0x30)); 0x004568a0 cmp rcx, qword [r12 + 0x38] | 0x004568a5 jne 0x456880 | | } 0x004568a7 movzx r14d, al | r14d = (int32_t) al; 0x004568ab mov rax, qword [r12] | rax = *(r12); 0x004568af mov rdi, r12 | rdi = r12; 0x004568b2 mov esi, r14d | esi = r14d; 0x004568b5 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x004568b8 cmp eax, r14d | | if (eax == r14d) { 0x004568bb je 0x45688b | goto label_1; | } 0x004568bd jmp 0x4568ca | goto label_7; | label_13: 0x004568bf mov r13d, 0xffffffff | r13d = 0xffffffff; 0x004568c5 jmp 0x4568ca | goto label_7; | label_11: 0x004568c7 xor r13d, r13d | r13d = 0; | label_7: 0x004568ca mov eax, r13d | eax = r13d; 0x004568cd add rsp, 0x18 | 0x004568d1 pop rbx | 0x004568d2 pop r12 | 0x004568d4 pop r13 | 0x004568d6 pop r14 | 0x004568d8 pop r15 | 0x004568da pop rbp | 0x004568db ret | return rax; | label_4: 0x004568dc lea rdi, [rsp + 0x10] | 0x004568e1 call 0x46aee0 | rax = BloombergLP::bdlt::Time::invalidMicrosecondsFromMidnight()const (rsp + 0x10); 0x004568e6 mov rcx, rax | rcx = rax; 0x004568e9 jmp 0x4565ec | goto label_2; | label_5: 0x004568ee lea rdi, [rsp + 0x10] | 0x004568f3 call 0x46aee0 | rax = BloombergLP::bdlt::Time::invalidMicrosecondsFromMidnight()const (rsp + 0x10); 0x004568f8 mov rcx, rax | rcx = rax; 0x004568fb jmp 0x456620 | goto label_3; | }