; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/none @ 0x44de50 */ | #include | ; (fcn) method.int_BloombergLP::balber::BerUtil_IntegerImpUtil.putIntegerValue_long__std::__1::basic_streambuf_char__std::__1::char_traits_char_____long_ () | int64_t method_int_BloombergLP::balber::BerUtil_IntegerImpUtil_putIntegerValue_long_std::_1::basic_streambuf_char_std::_1::char_traits_char_long_ (int64_t arg2, int64_t arg1) { | int64_t var_7h; | int64_t var_8h; | rsi = arg2; | rdi = arg1; | /* int BloombergLP::balber::BerUtil_IntegerImpUtil::putIntegerValue(std::__1::basic_streambuf >*, long) */ 0x0044de50 push rbp | 0x0044de51 push r15 | 0x0044de53 push r14 | 0x0044de55 push r12 | 0x0044de57 push rbx | 0x0044de58 sub rsp, 0x10 | 0x0044de5c mov r14, rsi | r14 = rsi; 0x0044de5f mov r12, rdi | r12 = rdi; 0x0044de62 test rsi, rsi | | if (rsi == 0) { 0x0044de65 je 0x44dea1 | goto label_1; | } | if (rsi <= 0) { 0x0044de67 jle 0x44dea8 | goto label_2; | } 0x0044de69 mov rax, r14 | rax = r14; 0x0044de6c shr rax, 0x37 | rax >>= 0x37; 0x0044de70 mov ebp, 8 | | if (rax != 0) { 0x0044de75 jne 0x44dee1 | goto label_3; | } 0x0044de77 mov ebp, 8 | 0x0044de7c mov rcx, r14 | rcx = r14; 0x0044de7f mov rax, r14 | rax = r14; 0x0044de82 nop word cs:[rax + rax] | 0x0044de8c nop dword [rax] | | do { 0x0044de90 shl rax, 8 | rax <<= 8; 0x0044de94 dec ebp | ebp--; 0x0044de96 shr rcx, 0x2f | rcx >>= 0x2f; 0x0044de9a mov rcx, rax | rcx = rax; 0x0044de9d je 0x44de90 | | } while (rcx == 0); 0x0044de9f jmp 0x44dee1 | goto label_3; | label_1: 0x0044dea1 mov ebp, 1 | 0x0044dea6 jmp 0x44dee1 | goto label_3; | label_2: 0x0044dea8 movabs rax, 0xff80000000000000 | rax = 0xff80000000000000; 0x0044deb2 mov rcx, r14 | rcx = r14; 0x0044deb5 or rcx, rax | rcx |= rax; 0x0044deb8 mov ebp, 8 | 0x0044debd cmp rcx, r14 | | if (rcx != r14) { 0x0044dec0 jne 0x44dee1 | goto label_3; | } 0x0044dec2 mov ebp, 8 | 0x0044dec7 mov rcx, r14 | rcx = r14; 0x0044deca nop word [rax + rax] | | do { 0x0044ded0 shl rcx, 8 | rcx <<= 8; 0x0044ded4 dec ebp | ebp--; 0x0044ded6 mov rdx, rcx | rdx = rcx; 0x0044ded9 or rdx, rax | rdx |= rax; 0x0044dedc cmp rdx, rcx | 0x0044dedf je 0x44ded0 | | } while (rdx == rcx); | label_3: 0x0044dee1 mov rax, qword [r12 + 0x30] | rax = *((r12 + 0x30)); 0x0044dee6 cmp rax, qword [r12 + 0x38] | | if (rax != *((r12 + 0x38))) { 0x0044deeb je 0x44deff | 0x0044deed lea rcx, [rax + 1] | rcx = rax + 1; 0x0044def1 mov qword [r12 + 0x30], rcx | *((r12 + 0x30)) = rcx; 0x0044def6 mov byte [rax], bpl | *(rax) = bpl; 0x0044def9 movzx eax, bpl | eax = (int32_t) bpl; 0x0044defd jmp 0x44df0d | | } else { 0x0044deff movzx esi, bpl | esi = (int32_t) bpl; 0x0044df03 mov rax, qword [r12] | rax = *(r12); 0x0044df07 mov rdi, r12 | rdi = r12; 0x0044df0a call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); | } 0x0044df0d mov r15d, 0xffffffff | r15d = 0xffffffff; 0x0044df13 cmp ebp, eax | | if (ebp != eax) { 0x0044df15 jne 0x44df6f | goto label_4; | } 0x0044df17 mov qword [rsp + 8], r14 | *((rsp + 8)) = r14; 0x0044df1c mov r15d, 0xffffffff | r15d = 0xffffffff; 0x0044df22 test ebp, ebp | | if (ebp <= 0) { 0x0044df24 jle 0x44df6f | goto label_4; | } 0x0044df26 cmp ebp, 8 | | if (ebp > 8) { 0x0044df29 ja 0x44df6f | goto label_4; | } 0x0044df2b mov ebx, ebp | ebx = ebp; 0x0044df2d jmp 0x44df46 | | while (rcx != *((r12 + 0x38))) { 0x0044df30 lea rdx, [rcx + 1] | rdx = rcx + 1; 0x0044df34 mov qword [r12 + 0x30], rdx | *((r12 + 0x30)) = rdx; 0x0044df39 mov byte [rcx], al | *(rcx) = al; | label_0: 0x0044df3b dec rbx | rbx--; 0x0044df3e lea eax, [rbx + 1] | eax = rbx + 1; 0x0044df41 cmp eax, 1 | | if (eax <= 1) { 0x0044df44 jle 0x44df6c | goto label_5; | } 0x0044df46 movzx eax, byte [rsp + rbx + 7] | eax = *((rsp + rbx + 7)); 0x0044df4b mov rcx, qword [r12 + 0x30] | rcx = *((r12 + 0x30)); 0x0044df50 cmp rcx, qword [r12 + 0x38] | 0x0044df55 jne 0x44df30 | | } 0x0044df57 movzx ebp, al | ebp = (int32_t) al; 0x0044df5a mov rax, qword [r12] | rax = *(r12); 0x0044df5e mov rdi, r12 | rdi = r12; 0x0044df61 mov esi, ebp | esi = ebp; 0x0044df63 call qword [rax + 0x68] | eax = uint64_t (*rax + 0x68)() (); 0x0044df66 cmp eax, ebp | | if (eax == ebp) { 0x0044df68 je 0x44df3b | goto label_0; | } 0x0044df6a jmp 0x44df6f | goto label_4; | label_5: 0x0044df6c xor r15d, r15d | r15d = 0; | label_4: 0x0044df6f mov eax, r15d | eax = r15d; 0x0044df72 add rsp, 0x10 | 0x0044df76 pop rbx | 0x0044df77 pop r12 | 0x0044df79 pop r14 | 0x0044df7b pop r15 | 0x0044df7d pop rbp | 0x0044df7e ret | return rax; | }