; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/none @ 0x455520 */ | #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_DateImpUtil.putCompactBinaryDateTzValue_std::__1::basic_streambuf_char__std::__1::char_traits_char_____BloombergLP::bdlt::DateTz_const__BloombergLP::balber::BerEncoderOptions_const_ () | uint64_t method_BloombergLP::balber::BerUtil_DateImpUtil_putCompactBinaryDateTzValue_std::_1::basic_streambuf_char_std::_1::char_traits_char_BloombergLP::bdlt::DateTz_const_BloombergLP::balber::BerEncoderOptions_const_ (int64_t arg2, int64_t arg1) { | int64_t var_10h; | rsi = arg2; | rdi = arg1; | /* BloombergLP::balber::BerUtil_DateImpUtil::putCompactBinaryDateTzValue(std::__1::basic_streambuf >*, BloombergLP::bdlt::DateTz const&, BloombergLP::balber::BerEncoderOptions const*) */ 0x00455520 push rbp | 0x00455521 push r15 | 0x00455523 push r14 | 0x00455525 push r13 | 0x00455527 push r12 | 0x00455529 push rbx | 0x0045552a sub rsp, 0x18 | 0x0045552e mov r15, rdi | r15 = rdi; 0x00455531 mov ebp, dword [rsi] | ebp = *(rsi); 0x00455533 mov r13d, dword [rsi + 4] | r13d = *((rsi + 4)); 0x00455537 mov edi, ebp | 0x00455539 call 0x46a6a0 | eax = BloombergLP::bdlt::PosixDateImpUtil::serialToYear(int) (ebp, rsi); 0x0045553e mov r14d, eax | r14d = eax; 0x00455541 mov edi, ebp | 0x00455543 call 0x46a660 | eax = BloombergLP::bdlt::PosixDateImpUtil::serialToMonth(int) (ebp, rsi); 0x00455548 mov ebx, eax | ebx = eax; 0x0045554a mov edi, ebp | 0x0045554c call 0x46a620 | eax = BloombergLP::bdlt::PosixDateImpUtil::serialToDay(int) (ebp, rsi); 0x00455551 mov edi, r14d | 0x00455554 mov esi, ebx | 0x00455556 mov edx, eax | 0x00455558 call 0x46ac10 | eax = BloombergLP::bdlt::ProlepticDateImpUtil::ymdToSerial(int,int,int) (r14d, ebx, eax, rcx, r8); 0x0045555d lea ecx, [rax - 0xb4091] | ecx = rax - 0xb4091; 0x00455563 movsxd rbx, ecx | rbx = (int64_t) ecx; 0x00455566 test ebx, ebx | | if (ebx != 0) { 0x00455568 je 0x455581 | 0x0045556a cmp eax, 0xb4092 | | if (eax >= 0xb4092) { 0x0045556f jl 0x455589 | 0x00455571 mov rax, rbx | rax = rbx; 0x00455574 or rax, 1 | rax |= 1; 0x00455578 bsr rax, rax | __asm ("bsr rax, rax"); 0x0045557c xor eax, 0x3f | eax ^= 0x3f; 0x0045557f jmp 0x4555a4 | | } else { 0x00455581 mov r12d, 1 | r12d = 1; 0x00455587 jmp 0x4555c3 | goto label_2; | } 0x00455589 mov rax, rbx | rax = rbx; 0x0045558c not rax | rax = ~rax; 0x0045558f or rax, 1 | rax |= 1; 0x00455593 bsr rcx, rax | __asm ("bsr rcx, rax"); 0x00455597 xor ecx, 0x3f | ecx ^= 0x3f; 0x0045559a xor eax, eax | eax = 0; 0x0045559c cmp ebx, 0xffffffff | 0x0045559f sete al | al = (ebx == 0xffffffff) ? 1 : 0; 0x004555a2 add eax, ecx | eax += ecx; | } 0x004555a4 mov ecx, 0x48 | ecx = 0x48; 0x004555a9 sub ecx, eax | ecx -= eax; 0x004555ab mov r12d, 0x4f | r12d = 0x4f; 0x004555b1 sub r12d, eax | r12d -= eax; 0x004555b4 test ecx, ecx | 0x004555b6 cmovns r12d, ecx | __asm ("cmovns r12d, ecx"); 0x004555ba sar r12d, 3 | r12d >>= 3; 0x004555be cmp eax, 0x39 | | if (eax >= 0x39) { 0x004555c1 jl 0x4555e1 | | label_2: 0x004555c3 mov rax, qword [r15 + 0x30] | rax = *((r15 + 0x30)); 0x004555c7 cmp rax, qword [r15 + 0x38] | | if (rax == *((r15 + 0x38))) { 0x004555cb je 0x45567f | goto label_3; | } 0x004555d1 lea rcx, [rax + 1] | rcx = rax + 1; 0x004555d5 mov qword [r15 + 0x30], rcx | *((r15 + 0x30)) = rcx; 0x004555d9 mov byte [rax], 4 | *(rax) = 4; 0x004555dc jmp 0x45569c | goto label_4; | } 0x004555e1 lea esi, [r12 + 2] | 0x004555e6 mov rdi, r15 | 0x004555e9 call 0x453da0 | eax = BloombergLP::balber::BerUtil_LengthImpUtil::putLength(std::_1::basic_streambuf>*,int) (r15, r12 + 2); 0x004555ee mov r14d, 0xffffffff | r14d = 0xffffffff; 0x004555f4 test eax, eax | | if (eax != 0) { 0x004555f6 jne 0x4557c3 | goto label_5; | } 0x004555fc rol r13w, 8 | r13w = rotate_left16 (r13w, 8); 0x00455601 mov word [rsp], r13w | 0x00455606 mov rax, qword [r15] | rax = *(r15); 0x00455609 mov rsi, rsp | rsi = rsp; 0x0045560c mov edx, 2 | edx = 2; 0x00455611 mov rdi, r15 | rdi = r15; 0x00455614 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (r13w); 0x00455617 cmp rax, 2 | | if (rax != 2) { 0x0045561b jne 0x4557c3 | goto label_5; | } 0x00455621 mov qword [rsp], rbx | *(rsp) = rbx; 0x00455625 mov r14d, 0xffffffff | r14d = 0xffffffff; 0x0045562b cmp r12d, 8 | | if (r12d > 8) { 0x0045562f ja 0x4557c3 | goto label_5; | } 0x00455635 mov ebp, r12d | 0x00455638 jmp 0x455659 | | while (rcx != *((r15 + 0x38))) { 0x00455640 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x00455644 mov qword [r15 + 0x30], rdx | *((r15 + 0x30)) = rdx; 0x00455648 mov byte [rcx], al | *(rcx) = al; | label_0: 0x0045564a dec rbp | rbp--; 0x0045564d lea eax, [rbp + 1] | eax = rbp + 1; 0x00455650 cmp eax, 1 | | if (eax <= 1) { 0x00455653 jle 0x4557c0 | goto label_6; | } 0x00455659 movzx eax, byte [rsp + rbp - 1] | eax = *((rsp + rbp - 1)); 0x0045565e mov rcx, qword [r15 + 0x30] | rcx = *((r15 + 0x30)); 0x00455662 cmp rcx, qword [r15 + 0x38] | 0x00455666 jne 0x455640 | | } 0x00455668 movzx ebx, al | ebx = (int32_t) al; 0x0045566b mov rax, qword [r15] | rax = *(r15); 0x0045566e mov rdi, r15 | rdi = r15; 0x00455671 mov esi, ebx | esi = ebx; 0x00455673 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x00455676 cmp eax, ebx | | if (eax == ebx) { 0x00455678 je 0x45564a | goto label_0; | } 0x0045567a jmp 0x4557c3 | goto label_5; | label_3: 0x0045567f mov rax, qword [r15] | rax = *(r15); 0x00455682 mov rdi, r15 | rdi = r15; 0x00455685 mov esi, 4 | esi = 4; 0x0045568a call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x0045568d mov r14d, 0xffffffff | r14d = 0xffffffff; 0x00455693 cmp eax, 4 | | if (eax != 4) { 0x00455696 jne 0x4557c3 | goto label_5; | } | label_4: 0x0045569c rol r13w, 8 | r13w = rotate_left16 (r13w, 8); 0x004556a1 mov word [rsp], r13w | 0x004556a6 mov rax, qword [r15] | rax = *(r15); 0x004556a9 mov rsi, rsp | rsi = rsp; 0x004556ac mov edx, 2 | edx = 2; 0x004556b1 mov rdi, r15 | rdi = r15; 0x004556b4 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (r13w); 0x004556b7 mov r14d, 0xffffffff | r14d = 0xffffffff; 0x004556bd cmp rax, 2 | | if (rax != 2) { 0x004556c1 jne 0x4557c3 | goto label_5; | } 0x004556c7 mov qword [rsp + 0x10], rbx | *((rsp + 0x10)) = rbx; 0x004556cc mov rsi, rbx | 0x004556cf sar rsi, 0x3f | rsi >>= 0x3f; 0x004556d3 mov r13d, 2 | r13d = 2; 0x004556d9 sub r13d, r12d | r13d -= r12d; 0x004556dc mov ebx, 0x11 | ebx = 0x11; 0x004556e1 sub ebx, r12d | ebx -= r12d; 0x004556e4 test r13d, r13d | 0x004556e7 mov ebp, r13d | 0x004556ea cmovs ebp, ebx | __asm ("cmovs ebp, ebx"); 0x004556ed movsxd rdx, r13d | rdx = (int64_t) r13d; 0x004556f0 mov rdi, rsp | 0x004556f3 call 0x4041f0 | memset (rsp, rbx, rdx); 0x004556f8 cmp ebx, 0x1f | | if (ebx < 0x1f) { 0x004556fb jb 0x455730 | goto label_7; | } 0x004556fd mov r14d, ebp | r14d = ebp; 0x00455700 sar r14d, 4 | r14d >>= 4; 0x00455704 mov rbx, rsp | rbx = rsp; 0x00455707 nop word [rax + rax] | | do { 0x00455710 mov rax, qword [r15] | rax = *(r15); 0x00455713 mov edx, 0x10 | edx = 0x10; 0x00455718 mov rdi, r15 | rdi = r15; 0x0045571b mov rsi, rbx | rsi = rbx; 0x0045571e call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x00455721 cmp rax, 0x10 | | if (rax != 0x10) { 0x00455725 jne 0x4557b8 | goto label_8; | } 0x0045572b dec r14d | r14d--; 0x0045572e jne 0x455710 | | } while (r14d != 0); | label_7: 0x00455730 and ebp, 0xfffffff0 | ebp &= 0xfffffff0; 0x00455733 sub r13d, ebp | r13d -= ebp; 0x00455736 movsxd rbp, r13d | rbp = (int64_t) r13d; 0x00455739 mov rax, qword [r15] | rax = *(r15); 0x0045573c mov rsi, rsp | rsi = rsp; 0x0045573f mov rdi, r15 | rdi = r15; 0x00455742 mov rdx, rbp | rdx = rbp; 0x00455745 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x00455748 cmp rax, rbp | 0x0045574b mov r14d, 0xffffffff | r14d = 0xffffffff; 0x00455751 mov rax, qword [rsp + 0x10] | rax = *((rsp + 0x10)); | if (rax != rbp) { 0x00455756 jne 0x4557c3 | goto label_5; | } 0x00455758 mov qword [rsp], rax | *(rsp) = rax; 0x0045575c mov r14d, 0xffffffff | r14d = 0xffffffff; 0x00455762 test r12d, r12d | | if (r12d <= 0) { 0x00455765 jle 0x4557c3 | goto label_5; | } 0x00455767 cmp r12d, 8 | | if (r12d > 8) { 0x0045576b ja 0x4557c3 | goto label_5; | } 0x0045576d mov ebp, r12d | 0x00455770 jmp 0x455795 | | while (rcx != *((r15 + 0x38))) { 0x00455780 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x00455784 mov qword [r15 + 0x30], rdx | *((r15 + 0x30)) = rdx; 0x00455788 mov byte [rcx], al | *(rcx) = al; | label_1: 0x0045578a dec rbp | rbp--; 0x0045578d lea eax, [rbp + 1] | eax = rbp + 1; 0x00455790 cmp eax, 1 | | if (eax <= 1) { 0x00455793 jle 0x4557c0 | goto label_6; | } 0x00455795 movzx eax, byte [rsp + rbp - 1] | eax = *((rsp + rbp - 1)); 0x0045579a mov rcx, qword [r15 + 0x30] | rcx = *((r15 + 0x30)); 0x0045579e cmp rcx, qword [r15 + 0x38] | 0x004557a2 jne 0x455780 | | } 0x004557a4 movzx ebx, al | ebx = (int32_t) al; 0x004557a7 mov rax, qword [r15] | rax = *(r15); 0x004557aa mov rdi, r15 | rdi = r15; 0x004557ad mov esi, ebx | esi = ebx; 0x004557af call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x004557b2 cmp eax, ebx | | if (eax == ebx) { 0x004557b4 je 0x45578a | goto label_1; | } 0x004557b6 jmp 0x4557c3 | goto label_5; | label_8: 0x004557b8 mov r14d, 0xffffffff | r14d = 0xffffffff; 0x004557be jmp 0x4557c3 | goto label_5; | label_6: 0x004557c0 xor r14d, r14d | r14d = 0; | label_5: 0x004557c3 mov eax, r14d | eax = r14d; 0x004557c6 add rsp, 0x18 | 0x004557ca pop rbx | 0x004557cb pop r12 | 0x004557cd pop r13 | 0x004557cf pop r14 | 0x004557d1 pop r15 | 0x004557d3 pop rbp | 0x004557d4 ret | return rax; | }