; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/assume @ 0x4555d0 */ | #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) { | rsi = arg2; | rdi = arg1; | /* BloombergLP::balber::BerUtil_DateImpUtil::putCompactBinaryDateTzValue(std::__1::basic_streambuf >*, BloombergLP::bdlt::DateTz const&, BloombergLP::balber::BerEncoderOptions const*) */ 0x004555d0 push rbp | 0x004555d1 push r15 | 0x004555d3 push r14 | 0x004555d5 push r13 | 0x004555d7 push r12 | 0x004555d9 push rbx | 0x004555da sub rsp, 0x18 | 0x004555de mov r12, rdi | r12 = rdi; 0x004555e1 mov ebp, dword [rsi] | ebp = *(rsi); 0x004555e3 mov r15d, dword [rsi + 4] | r15d = *((rsi + 4)); 0x004555e7 mov edi, ebp | 0x004555e9 call 0x46a320 | eax = BloombergLP::bdlt::PosixDateImpUtil::serialToYear(int) (ebp, rsi); 0x004555ee mov r14d, eax | r14d = eax; 0x004555f1 mov edi, ebp | 0x004555f3 call 0x46a2e0 | eax = BloombergLP::bdlt::PosixDateImpUtil::serialToMonth(int) (ebp, rsi); 0x004555f8 mov ebx, eax | ebx = eax; 0x004555fa mov edi, ebp | 0x004555fc call 0x46a2a0 | eax = BloombergLP::bdlt::PosixDateImpUtil::serialToDay(int) (ebp, rsi); 0x00455601 mov edi, r14d | 0x00455604 mov esi, ebx | 0x00455606 mov edx, eax | 0x00455608 call 0x46a870 | eax = BloombergLP::bdlt::ProlepticDateImpUtil::ymdToSerial(int,int,int) (r14d, ebx, eax, rcx, r8); 0x0045560d lea ecx, [rax - 0xb4091] | ecx = rax - 0xb4091; 0x00455613 movsxd r13, ecx | r13 = (int64_t) ecx; 0x00455616 test r13d, r13d | | if (r13d != 0) { 0x00455619 je 0x455632 | 0x0045561b cmp eax, 0xb4092 | | if (eax >= 0xb4092) { 0x00455620 jl 0x45563a | 0x00455622 mov rax, r13 | rax = r13; 0x00455625 or rax, 1 | rax |= 1; 0x00455629 bsr rax, rax | __asm ("bsr rax, rax"); 0x0045562d xor eax, 0x3f | eax ^= 0x3f; 0x00455630 jmp 0x455656 | | } else { 0x00455632 mov r14d, 1 | r14d = 1; 0x00455638 jmp 0x455675 | goto label_2; | } 0x0045563a mov rax, r13 | rax = r13; 0x0045563d not rax | rax = ~rax; 0x00455640 or rax, 1 | rax |= 1; 0x00455644 bsr rcx, rax | __asm ("bsr rcx, rax"); 0x00455648 xor ecx, 0x3f | ecx ^= 0x3f; 0x0045564b xor eax, eax | eax = 0; 0x0045564d cmp r13d, 0xffffffff | 0x00455651 sete al | al = (r13d == 0xffffffff) ? 1 : 0; 0x00455654 add eax, ecx | eax += ecx; | } 0x00455656 mov ecx, 0x48 | ecx = 0x48; 0x0045565b sub ecx, eax | ecx -= eax; 0x0045565d mov r14d, 0x4f | r14d = 0x4f; 0x00455663 sub r14d, eax | r14d -= eax; 0x00455666 test ecx, ecx | 0x00455668 cmovns r14d, ecx | __asm ("cmovns r14d, ecx"); 0x0045566c sar r14d, 3 | r14d >>= 3; 0x00455670 cmp eax, 0x39 | | if (eax >= 0x39) { 0x00455673 jl 0x455696 | | label_2: 0x00455675 mov rax, qword [r12 + 0x30] | rax = *((r12 + 0x30)); 0x0045567a cmp rax, qword [r12 + 0x38] | | if (rax == *((r12 + 0x38))) { 0x0045567f je 0x455733 | goto label_3; | } 0x00455685 lea rcx, [rax + 1] | rcx = rax + 1; 0x00455689 mov qword [r12 + 0x30], rcx | *((r12 + 0x30)) = rcx; 0x0045568e mov byte [rax], 4 | *(rax) = 4; 0x00455691 jmp 0x455750 | goto label_4; | } 0x00455696 lea esi, [r14 + 2] | 0x0045569a mov rdi, r12 | 0x0045569d call 0x453df0 | eax = BloombergLP::balber::BerUtil_LengthImpUtil::putLength(std::_1::basic_streambuf>*,int) (r12, r14 + 2); 0x004556a2 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x004556a7 test eax, eax | | if (eax != 0) { 0x004556a9 jne 0x455853 | goto label_5; | } 0x004556af rol r15w, 8 | r15w = rotate_left16 (r15w, 8); 0x004556b4 mov word [rsp], r15w | 0x004556b9 mov rax, qword [r12] | rax = *(r12); 0x004556bd mov rsi, rsp | rsi = rsp; 0x004556c0 mov edx, 2 | edx = 2; 0x004556c5 mov rdi, r12 | rdi = r12; 0x004556c8 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (r15w); 0x004556cb cmp rax, 2 | | if (rax != 2) { 0x004556cf jne 0x455853 | goto label_5; | } 0x004556d5 mov qword [rsp], r13 | *(rsp) = r13; 0x004556d9 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x004556de cmp r14d, 8 | | if (r14d > 8) { 0x004556e2 ja 0x455853 | goto label_5; | } 0x004556e8 mov ebp, r14d | 0x004556eb jmp 0x45570a | | while (rcx != *((r12 + 0x38))) { 0x004556f0 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x004556f4 mov qword [r12 + 0x30], rdx | *((r12 + 0x30)) = rdx; 0x004556f9 mov byte [rcx], al | *(rcx) = al; | label_0: 0x004556fb dec rbp | rbp--; 0x004556fe lea eax, [rbp + 1] | eax = rbp + 1; 0x00455701 cmp eax, 1 | | if (eax <= 1) { 0x00455704 jle 0x455851 | goto label_6; | } 0x0045570a movzx eax, byte [rsp + rbp - 1] | eax = *((rsp + rbp - 1)); 0x0045570f mov rcx, qword [r12 + 0x30] | rcx = *((r12 + 0x30)); 0x00455714 cmp rcx, qword [r12 + 0x38] | 0x00455719 jne 0x4556f0 | | } 0x0045571b movzx ebx, al | ebx = (int32_t) al; 0x0045571e mov rax, qword [r12] | rax = *(r12); 0x00455722 mov rdi, r12 | rdi = r12; 0x00455725 mov esi, ebx | esi = ebx; 0x00455727 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x0045572a cmp eax, ebx | | if (eax == ebx) { 0x0045572c je 0x4556fb | goto label_0; | } 0x0045572e jmp 0x45584a | goto label_7; | label_3: 0x00455733 mov rax, qword [r12] | rax = *(r12); 0x00455737 mov rdi, r12 | rdi = r12; 0x0045573a mov esi, 4 | esi = 4; 0x0045573f call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x00455742 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x00455747 cmp eax, 4 | | if (eax != 4) { 0x0045574a jne 0x455853 | goto label_5; | } | label_4: 0x00455750 rol r15w, 8 | r15w = rotate_left16 (r15w, 8); 0x00455755 mov word [rsp], r15w | 0x0045575a mov rax, qword [r12] | rax = *(r12); 0x0045575e mov rsi, rsp | rsi = rsp; 0x00455761 mov edx, 2 | edx = 2; 0x00455766 mov rdi, r12 | rdi = r12; 0x00455769 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (r15w); 0x0045576c mov ebx, 0xffffffff | ebx = 0xffffffff; 0x00455771 cmp rax, 2 | | if (rax != 2) { 0x00455775 jne 0x455853 | goto label_5; | } 0x0045577b mov rsi, r13 | 0x0045577e sar rsi, 0x3f | rsi >>= 0x3f; 0x00455782 mov r15d, 2 | r15d = 2; 0x00455788 sub r15d, r14d | r15d -= r14d; 0x0045578b mov ebx, r15d | ebx = r15d; 0x0045578e shr ebx, 4 | ebx >>= 4; 0x00455791 mov rdi, rsp | 0x00455794 mov rdx, r15 | 0x00455797 call 0x4041f0 | rax = memset (rsp, r13, r15); 0x0045579c test ebx, ebx | | if (ebx == 0) { 0x0045579e je 0x4557d0 | goto label_8; | } 0x004557a0 mov rbp, rsp | 0x004557a3 nop word cs:[rax + rax] | 0x004557ad nop dword [rax] | | do { 0x004557b0 mov rax, qword [r12] | rax = *(r12); 0x004557b4 mov edx, 0x10 | edx = 0x10; 0x004557b9 mov rdi, r12 | rdi = r12; 0x004557bc mov rsi, rbp | rsi = rbp; 0x004557bf call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x004557c2 cmp rax, 0x10 | | if (rax != 0x10) { 0x004557c6 jne 0x45584a | goto label_7; | } 0x004557cc dec ebx | ebx--; 0x004557ce jne 0x4557b0 | | } while (ebx != 0); | label_8: 0x004557d0 and r15d, 0xf | r15d &= 0xf; 0x004557d4 mov ebx, r15d | ebx = r15d; 0x004557d7 mov rax, qword [r12] | rax = *(r12); 0x004557db mov rsi, rsp | rsi = rsp; 0x004557de mov rdi, r12 | rdi = r12; 0x004557e1 mov rdx, rbx | rdx = rbx; 0x004557e4 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x004557e7 cmp rax, rbx | 0x004557ea mov ebx, 0xffffffff | ebx = 0xffffffff; | if (rax != rbx) { 0x004557ef jne 0x455853 | goto label_5; | } 0x004557f1 mov qword [rsp], r13 | *(rsp) = r13; 0x004557f5 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x004557fa test r14d, r14d | | if (r14d <= 0) { 0x004557fd jle 0x455853 | goto label_5; | } 0x004557ff cmp r14d, 8 | | if (r14d > 8) { 0x00455803 ja 0x455853 | goto label_5; | } 0x00455805 mov ebp, r14d | 0x00455808 jmp 0x455826 | | while (rcx != *((r12 + 0x38))) { 0x00455810 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x00455814 mov qword [r12 + 0x30], rdx | *((r12 + 0x30)) = rdx; 0x00455819 mov byte [rcx], al | *(rcx) = al; | label_1: 0x0045581b dec rbp | rbp--; 0x0045581e lea eax, [rbp + 1] | eax = rbp + 1; 0x00455821 cmp eax, 1 | | if (eax <= 1) { 0x00455824 jle 0x455851 | goto label_6; | } 0x00455826 movzx eax, byte [rsp + rbp - 1] | eax = *((rsp + rbp - 1)); 0x0045582b mov rcx, qword [r12 + 0x30] | rcx = *((r12 + 0x30)); 0x00455830 cmp rcx, qword [r12 + 0x38] | 0x00455835 jne 0x455810 | | } 0x00455837 movzx ebx, al | ebx = (int32_t) al; 0x0045583a mov rax, qword [r12] | rax = *(r12); 0x0045583e mov rdi, r12 | rdi = r12; 0x00455841 mov esi, ebx | esi = ebx; 0x00455843 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x00455846 cmp eax, ebx | | if (eax == ebx) { 0x00455848 je 0x45581b | goto label_1; | } | label_7: 0x0045584a mov ebx, 0xffffffff | ebx = 0xffffffff; 0x0045584f jmp 0x455853 | goto label_5; | label_6: 0x00455851 xor ebx, ebx | ebx = 0; | label_5: 0x00455853 mov eax, ebx | eax = ebx; 0x00455855 add rsp, 0x18 | 0x00455859 pop rbx | 0x0045585a pop r12 | 0x0045585c pop r13 | 0x0045585e pop r14 | 0x00455860 pop r15 | 0x00455862 pop rbp | 0x00455863 ret | return rax; | }