; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/assume @ 0x458150 */ | #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_DatetimeImpUtil.putCompactBinaryDatetimeTzValue_std::__1::basic_streambuf_char__std::__1::char_traits_char_____int__long_long__int__BloombergLP::balber::BerEncoderOptions_const_ () | uint64_t method_BloombergLP::balber::BerUtil_DatetimeImpUtil_putCompactBinaryDatetimeTzValue_std::_1::basic_streambuf_char_std::_1::char_traits_char_int_long_long_int_BloombergLP::balber::BerEncoderOptions_const_ (signed int64_t arg4, int64_t arg3, int64_t arg2, int64_t arg1) { | int64_t var_10h; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::balber::BerUtil_DatetimeImpUtil::putCompactBinaryDatetimeTzValue(std::__1::basic_streambuf >*, int, long long, int, BloombergLP::balber::BerEncoderOptions const*) */ 0x00458150 push rbp | 0x00458151 push r15 | 0x00458153 push r14 | 0x00458155 push r13 | 0x00458157 push r12 | 0x00458159 push rbx | 0x0045815a sub rsp, 0x18 | 0x0045815e mov ebp, esi | 0x00458160 lea eax, [rbp + 0x59f] | eax = rbp + 0x59f; 0x00458166 mov r14d, 0xffffffff | r14d = 0xffffffff; 0x0045816c cmp eax, 0xb3e | | if (eax > 0xb3e) { 0x00458171 ja 0x4582ee | goto label_1; | } 0x00458177 mov r12d, ecx | r12d = ecx; 0x0045817a mov r15, rdx | r15 = rdx; 0x0045817d mov rbx, rdi | rbx = rdi; 0x00458180 cmp ecx, 4 | | if (ecx <= 4) { 0x00458183 jg 0x45819c | 0x00458185 mov rax, qword [rbx + 0x30] | rax = *((rbx + 0x30)); 0x00458189 cmp rax, qword [rbx + 0x38] | | if (rax != *((rbx + 0x38))) { 0x0045818d je 0x4581d9 | 0x0045818f lea rcx, [rax + 1] | rcx = rax + 1; 0x00458193 mov qword [rbx + 0x30], rcx | *((rbx + 0x30)) = rcx; 0x00458197 mov byte [rax], 7 | *(rax) = 7; 0x0045819a jmp 0x4581f0 | | } else { 0x0045819c lea esi, [r12 + 2] | 0x004581a1 mov rdi, rbx | 0x004581a4 call 0x453df0 | eax = BloombergLP::balber::BerUtil_LengthImpUtil::putLength(std::_1::basic_streambuf>*,int) (rbx, r12 + 2); 0x004581a9 test eax, eax | | if (eax != 0) { 0x004581ab jne 0x4582ee | goto label_1; | } 0x004581b1 rol bp, 8 | bp = rotate_left16 (bp, 8); 0x004581b5 mov word [rsp], bp | 0x004581b9 mov rax, qword [rbx] | rax = *(rbx); 0x004581bc mov rsi, rsp | rsi = rsp; 0x004581bf mov edx, 2 | edx = 2; 0x004581c4 mov rdi, rbx | rdi = rbx; 0x004581c7 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (bp); 0x004581ca cmp rax, 2 | | if (rax == 2) { 0x004581ce je 0x458290 | goto label_2; | } 0x004581d4 jmp 0x4582ee | goto label_1; | } 0x004581d9 mov rax, qword [rbx] | rax = *(rbx); 0x004581dc mov rdi, rbx | rdi = rbx; 0x004581df mov esi, 7 | esi = 7; 0x004581e4 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x004581e7 cmp eax, 7 | | if (eax != 7) { 0x004581ea jne 0x4582ee | goto label_1; | } | } 0x004581f0 rol bp, 8 | bp = rotate_left16 (bp, 8); 0x004581f4 mov word [rsp], bp | 0x004581f8 mov rax, qword [rbx] | rax = *(rbx); 0x004581fb mov rsi, rsp | rsi = rsp; 0x004581fe mov edx, 2 | edx = 2; 0x00458203 mov rdi, rbx | rdi = rbx; 0x00458206 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)(void) (bp); 0x00458209 cmp rax, 2 | | if (rax != 2) { 0x0045820d jne 0x4582ee | goto label_1; | } 0x00458213 mov qword [rsp + 0x10], r15 | *((rsp + 0x10)) = r15; 0x00458218 mov rax, r15 | rax = r15; 0x0045821b sar rax, 0x3f | rax >>= 0x3f; 0x0045821f mov r15d, 5 | r15d = 5; 0x00458225 sub r15d, r12d | r15d -= r12d; 0x00458228 mov r13d, r15d | r13d = r15d; 0x0045822b shr r13d, 4 | r13d >>= 4; 0x0045822f mov edx, r15d | 0x00458232 movzx esi, al | esi = (int32_t) al; 0x00458235 mov rdi, rsp | 0x00458238 call 0x4041f0 | memset (rsp, rsi, r15d); 0x0045823d test r13d, r13d | | if (r13d == 0) { 0x00458240 je 0x458270 | goto label_3; | } 0x00458242 mov rbp, rsp | 0x00458245 nop word cs:[rax + rax] | 0x0045824f nop | | do { 0x00458250 mov rax, qword [rbx] | rax = *(rbx); 0x00458253 mov edx, 0x10 | edx = 0x10; 0x00458258 mov rdi, rbx | rdi = rbx; 0x0045825b mov rsi, rbp | rsi = rbp; 0x0045825e call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x00458261 cmp rax, 0x10 | | if (rax != 0x10) { 0x00458265 jne 0x4582ee | goto label_1; | } 0x0045826b dec r13d | r13d--; 0x0045826e jne 0x458250 | | } while (r13d != 0); | label_3: 0x00458270 and r15d, 0xf | r15d &= 0xf; 0x00458274 mov ebp, r15d | 0x00458277 mov rax, qword [rbx] | rax = *(rbx); 0x0045827a mov rsi, rsp | rsi = rsp; 0x0045827d mov rdi, rbx | rdi = rbx; 0x00458280 mov rdx, rbp | rdx = rbp; 0x00458283 call qword [rax + 0x60] | rax = uint64_t (*rax + 0x60)() (); 0x00458286 cmp rax, rbp | 0x00458289 mov r15, qword [rsp + 0x10] | r15 = *((rsp + 0x10)); | if (rax != rbp) { 0x0045828e jne 0x4582ee | goto label_1; | } | label_2: 0x00458290 mov qword [rsp], r15 | *(rsp) = r15; 0x00458294 mov r14d, 0xffffffff | r14d = 0xffffffff; 0x0045829a test r12d, r12d | | if (r12d <= 0) { 0x0045829d jle 0x4582ee | goto label_1; | } 0x0045829f cmp r12d, 8 | | if (r12d > 8) { 0x004582a3 ja 0x4582ee | goto label_1; | } 0x004582a5 mov ebp, r12d | 0x004582a8 jmp 0x4582c5 | | while (rcx != *((rbx + 0x38))) { 0x004582b0 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x004582b4 mov qword [rbx + 0x30], rdx | *((rbx + 0x30)) = rdx; 0x004582b8 mov byte [rcx], al | *(rcx) = al; | label_0: 0x004582ba dec rbp | rbp--; 0x004582bd lea eax, [rbp + 1] | eax = rbp + 1; 0x004582c0 cmp eax, 1 | | if (eax <= 1) { 0x004582c3 jle 0x4582eb | goto label_4; | } 0x004582c5 movzx eax, byte [rsp + rbp - 1] | eax = *((rsp + rbp - 1)); 0x004582ca mov rcx, qword [rbx + 0x30] | rcx = *((rbx + 0x30)); 0x004582ce cmp rcx, qword [rbx + 0x38] | 0x004582d2 jne 0x4582b0 | | } 0x004582d4 movzx r15d, al | r15d = (int32_t) al; 0x004582d8 mov rax, qword [rbx] | rax = *(rbx); 0x004582db mov rdi, rbx | rdi = rbx; 0x004582de mov esi, r15d | esi = r15d; 0x004582e1 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x004582e4 cmp eax, r15d | | if (eax == r15d) { 0x004582e7 je 0x4582ba | goto label_0; | } 0x004582e9 jmp 0x4582ee | goto label_1; | label_4: 0x004582eb xor r14d, r14d | r14d = 0; | label_1: 0x004582ee mov eax, r14d | eax = r14d; 0x004582f1 add rsp, 0x18 | 0x004582f5 pop rbx | 0x004582f6 pop r12 | 0x004582f8 pop r13 | 0x004582fa pop r14 | 0x004582fc pop r15 | 0x004582fe pop rbp | 0x004582ff ret | return rax; | }