; assembly | /* r2dec pseudo code output */ | /* balber_berdecoder.t/none @ 0x449440 */ | #include | ; (fcn) method.int_BloombergLP::balber::BerDecoder_Node::decodeChoice_BloombergLP::s_baltst.MyChoice__BloombergLP::s_baltst::MyChoice_ () | int64_t method_int_BloombergLP::balber::BerDecoder_Node::decodeChoice_BloombergLP::s_baltst_MyChoice_BloombergLP::s_baltst::MyChoice_ (int64_t arg2, int64_t arg1) { | int64_t var_8h; | uint32_t var_10h; | uint32_t var_14h; | int64_t var_18h; | int64_t var_1ch; | int64_t var_20h; | int64_t var_24h; | int64_t var_28h; | int64_t var_2ch; | int64_t var_30h; | rsi = arg2; | rdi = arg1; | /* int BloombergLP::balber::BerDecoder_Node::decodeChoice(BloombergLP::s_baltst::MyChoice*) */ 0x00449440 push rbp | 0x00449441 push r15 | 0x00449443 push r14 | 0x00449445 push r13 | 0x00449447 push r12 | 0x00449449 push rbx | 0x0044944a sub rsp, 0x38 | 0x0044944e mov r15, rsi | r15 = rsi; 0x00449451 mov rbx, rdi | rbx = rdi; 0x00449454 mov rax, qword [rdi] | rax = *(rdi); 0x00449457 mov qword [rsp], rax | *(rsp) = rax; 0x0044945b mov rcx, qword [rax + 0x118] | rcx = *((rax + 0x118)); 0x00449462 mov qword [rsp + 8], rcx | *((rsp + 8)) = rcx; 0x00449467 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0044946a movups xmmword [rsp + 0x10], xmm0 | __asm ("movups xmmword [rsp + 0x10], xmm0"); 0x0044946f movups xmmword [rsp + 0x20], xmm0 | __asm ("movups xmmword [rsp + 0x20], xmm0"); 0x00449474 mov qword [rsp + 0x30], 0 | *((rsp + 0x30)) = 0; 0x0044947d inc dword [rax + 0x110] | *((rax + 0x110))++; 0x00449483 test rcx, rcx | | if (rcx != 0) { 0x00449486 je 0x44948f | 0x00449488 mov ecx, dword [rcx + 0x2c] | ecx = *((rcx + 0x2c)); 0x0044948b mov dword [rsp + 0x2c], ecx | *((rsp + 0x2c)) = ecx; | } 0x0044948f mov rdi, rsp | 0x00449492 mov qword [rax + 0x118], rdi | *((rax + 0x118)) = rdi; 0x00449499 call 0x450990 | eax = BloombergLP::balber::BerDecoder_Node::readTagHeader() (rsp); 0x0044949e test eax, eax | | if (eax != 0) { 0x004494a0 jne 0x449549 | goto label_3; | } 0x004494a6 cmp dword [rsp + 0x10], 0x80 | | if (*((rsp + 0x10)) == 0x80) { 0x004494ae jne 0x4494dd | 0x004494b0 mov edi, dword [rsp + 0x18] | 0x004494b4 call 0x45aa70 | rax = BloombergLP::s_baltst::MyChoice::lookupSelectionInfo(int) (*((rsp + 0x18))); 0x004494b9 test rax, rax | | if (rax == 0) { 0x004494bc je 0x4494ec | goto label_4; | } 0x004494be mov esi, dword [rsp + 0x18] | 0x004494c2 mov rdi, r15 | 0x004494c5 call 0x45b160 | eax = BloombergLP::s_baltst::MyChoice::makeSelection(int) (r15, *((rsp + 0x18))); 0x004494ca test eax, eax | | if (eax == 0) { 0x004494cc je 0x44950b | goto label_5; | } 0x004494ce mov rdi, rsp | 0x004494d1 mov esi, 0x49ab4f | 0x004494d6 call 0x450230 | BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp, "Unable to make choice selection"); 0x004494db jmp 0x449549 | goto label_3; | } 0x004494dd mov rdi, rsp | 0x004494e0 mov esi, 0x49ab20 | 0x004494e5 call 0x450230 | BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp, "Expected CONTEXT tag class for internal choice"); 0x004494ea jmp 0x449549 | goto label_3; | label_4: 0x004494ec mov rdi, rsp | 0x004494ef call 0x450d80 | eax = BloombergLP::balber::BerDecoder_Node::skipField() (rsp); 0x004494f4 mov rcx, qword [rbx] | rcx = *(rbx); 0x004494f7 inc dword [rcx + 0x114] | *((rcx + 0x114))++; | do { | label_0: 0x004494fd test eax, eax | | if (eax != 0) { 0x004494ff jne 0x449549 | goto label_3; | } | label_2: 0x00449501 mov rdi, rsp | 0x00449504 call 0x450bd0 | BloombergLP::balber::BerDecoder_Node::readTagTrailer() (rsp); 0x00449509 jmp 0x449549 | goto label_3; | label_5: 0x0044950b mov ecx, dword [r15 + 0x30] | ecx = *((r15 + 0x30)); 0x0044950f cmp ecx, 1 | | if (ecx == 1) { 0x00449512 je 0x449582 | goto label_6; | } 0x00449514 mov eax, 0xffffffff | eax = 0xffffffff; 0x00449519 test ecx, ecx | | if (ecx != 0) { 0x0044951b jne 0x449549 | goto label_3; | } 0x0044951d mov eax, dword [rip + 0x52bfd] | eax = *(0x0049c120); 0x00449523 mov dword [rsp + 0x2c], eax | *((rsp + 0x2c)) = eax; 0x00449527 mov rax, qword [rip + 0x52bda] | rax = *(str.selection1); 0x0044952e mov qword [rsp + 0x30], rax | *((rsp + 0x30)) = rax; 0x00449533 cmp dword [rsp + 0x14], 0 | | if (*((rsp + 0x14)) == 0) { 0x00449538 je 0x4495b1 | goto label_7; | } 0x0044953a mov rdi, rsp | 0x0044953d mov esi, 0x49a92b | 0x00449542 call 0x450230 | BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp, "Expected PRIMITIVE tag type for simple type"); 0x00449547 jmp 0x4494fd | | } while (1); | label_3: 0x00449549 mov rcx, qword [rsp + 8] | rcx = *((rsp + 8)); 0x0044954e test rcx, rcx | | if (rcx != 0) { 0x00449551 je 0x449562 | 0x00449553 mov edx, dword [rsp + 0x24] | edx = *((rsp + 0x24)); 0x00449557 add edx, dword [rsp + 0x20] | edx += *((rsp + 0x20)); 0x0044955b add edx, dword [rsp + 0x28] | edx += *((rsp + 0x28)); 0x0044955f add dword [rcx + 0x24], edx | *((rcx + 0x24)) += edx; | } 0x00449562 mov rdx, qword [rsp] | rdx = *(rsp); 0x00449566 mov qword [rdx + 0x118], rcx | *((rdx + 0x118)) = rcx; 0x0044956d dec dword [rdx + 0x110] | *((rdx + 0x110))--; 0x00449573 add rsp, 0x38 | 0x00449577 pop rbx | 0x00449578 pop r12 | 0x0044957a pop r13 | 0x0044957c pop r14 | 0x0044957e pop r15 | 0x00449580 pop rbp | 0x00449581 ret | return rax; | label_6: 0x00449582 mov eax, dword [rip + 0x52bc0] | eax = *(0x0049c148); 0x00449588 mov dword [rsp + 0x2c], eax | *((rsp + 0x2c)) = eax; 0x0044958c mov rax, qword [rip + 0x52b9d] | rax = *(str.selection2); 0x00449593 mov qword [rsp + 0x30], rax | *((rsp + 0x30)) = rax; 0x00449598 cmp dword [rsp + 0x14], 0 | | if (*((rsp + 0x14)) != 0) { 0x0044959d je 0x4495da | 0x0044959f mov rdi, rsp | 0x004495a2 mov esi, 0x49a92b | 0x004495a7 call 0x450230 | BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp, "Expected PRIMITIVE tag type for simple type"); 0x004495ac jmp 0x4494fd | goto label_0; | label_7: 0x004495b1 mov r12d, dword [rsp + 0x1c] | r12d = *((rsp + 0x1c)); 0x004495b6 cmp r12d, 4 | | if (r12d > 4) { 0x004495ba ja 0x449680 | goto label_8; | } 0x004495c0 mov rax, qword [rsp] | rax = *(rsp); 0x004495c4 mov r14, qword [rax + 0x108] | r14 = *((rax + 0x108)); 0x004495cb mov rax, qword [r14 + 0x18] | rax = *((r14 + 0x18)); 0x004495cf cmp rax, qword [r14 + 0x20] | | if (rax != *((r14 + 0x20))) { 0x004495d3 je 0x44960e | 0x004495d5 movzx eax, byte [rax] | eax = *(rax); 0x004495d8 jmp 0x449617 | | } else { 0x004495da mov rax, qword [rsp] | rax = *(rsp); 0x004495de mov rcx, qword [rax] | 0x004495e1 mov rsi, qword [rax + 0x108] | 0x004495e8 mov edx, dword [rsp + 0x1c] | 0x004495ec mov rdi, r15 | 0x004495ef call 0x454b10 | eax = BloombergLP::balber::BerUtil_StringImpUtil::getStringValue(bsl::basic_string,bsl::allocator>*,std::_1::basic_streambuf>*,int,BloombergLP::balber::BerDecoderOptionsconst&) (r15, *((rax + 0x108)), *((rsp + 0x1c)), *(rax)); 0x004495f4 test eax, eax | | if (eax == 0) { 0x004495f6 je 0x449692 | goto label_9; | } 0x004495fc mov rdi, rsp | 0x004495ff mov esi, 0x49a957 | 0x00449604 call 0x450230 | BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp, "Error reading value for simple type"); 0x00449609 jmp 0x4494fd | goto label_0; | } 0x0044960e mov rax, qword [r14] | rax = *(r14); 0x00449611 mov rdi, r14 | rdi = r14; 0x00449614 call qword [rax + 0x48] | al = uint64_t (*rax + 0x48)() (); | } 0x00449617 sar al, 7 | al >>= 7; 0x0044961a movsx eax, al | eax = (int32_t) al; 0x0044961d mov dword [r15], eax | *(r15) = eax; 0x00449620 test r12d, r12d | | if (r12d <= 0) { 0x00449623 jle 0x449692 | goto label_9; | } 0x00449625 mov r13d, r12d | r13d = r12d; 0x00449628 neg r13d | r13d = -r13d; 0x0044962b mov bl, 1 | bl = 1; 0x0044962d mov ebp, 1 | 0x00449632 jmp 0x449663 | | while (rax != *((r14 + 0x20))) { 0x00449634 lea rcx, [rax + 1] | rcx = rax + 1; 0x00449638 mov qword [r14 + 0x18], rcx | *((r14 + 0x18)) = rcx; 0x0044963c movzx eax, byte [rax] | eax = *(rax); | label_1: 0x0044963f mov ecx, dword [r15] | ecx = *(r15); 0x00449642 shl ecx, 8 | ecx <<= 8; 0x00449645 movzx eax, al | eax = (int32_t) al; 0x00449648 or eax, ecx | eax |= ecx; 0x0044964a mov dword [r15], eax | *(r15) = eax; 0x0044964d cmp ebp, r12d | 0x00449650 setl bl | bl = (ebp < r12d) ? 1 : 0; 0x00449653 lea eax, [r13 + rbp + 1] | eax = r13 + rbp + 1; 0x00449658 mov ecx, ebp | ecx = ebp; 0x0044965a inc ecx | ecx++; 0x0044965c mov ebp, ecx | 0x0044965e cmp eax, 1 | | if (eax == 1) { 0x00449661 je 0x44967b | goto label_10; | } 0x00449663 mov rax, qword [r14 + 0x18] | rax = *((r14 + 0x18)); 0x00449667 cmp rax, qword [r14 + 0x20] | 0x0044966b jne 0x449634 | | } 0x0044966d mov rax, qword [r14] | rax = *(r14); 0x00449670 mov rdi, r14 | rdi = r14; 0x00449673 call qword [rax + 0x50] | eax = uint64_t (*rax + 0x50)() (); 0x00449676 cmp eax, 0xffffffff | | if (eax != 0xffffffff) { 0x00449679 jne 0x44963f | goto label_1; | } | label_10: 0x0044967b test bl, 1 | | if ((bl & 1) != 0) { 0x0044967e je 0x449692 | | label_8: 0x00449680 mov rdi, rsp | 0x00449683 mov esi, 0x49a957 | 0x00449688 call 0x450230 | BloombergLP::balber::BerDecoder_Node::logError(char const*) (rsp, "Error reading value for simple type"); 0x0044968d jmp 0x4494fd | goto label_0; | } | label_9: 0x00449692 mov eax, dword [rsp + 0x1c] | eax = *((rsp + 0x1c)); 0x00449696 mov dword [rsp + 0x24], eax | *((rsp + 0x24)) = eax; 0x0044969a jmp 0x449501 | goto label_2; | }