; assembly | /* r2dec pseudo code output */ | /* bslalg_rbtreeutil.t/assume @ 0x487af0 */ | #include | ; (fcn) sym.char_const_ggParseNode_IntNode__void____IntNode__int___IntNode__char_const__void___const__IntNode__int__ () | uint64_t char_const_ggParseNode_IntNode_void_IntNode_int_IntNode_char_const_void_const_IntNode_int_ (int64_t arg3, int64_t arg2, int64_t arg1) { | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* char const* ggParseNode(IntNode**, char const*, void (* const&)(IntNode*, int)) */ | label_0: 0x00487af0 push rbp | 0x00487af1 push r15 | 0x00487af3 push r14 | 0x00487af5 push r13 | 0x00487af7 push r12 | 0x00487af9 push rbx | 0x00487afa push rax | 0x00487afb mov qword [rsp], rdx | *(rsp) = rdx; 0x00487aff mov rbp, rsi | 0x00487b02 mov r12, qword [rdi] | r12 = *(rdi); 0x00487b05 lea rax, [r12 + 0x20] | rax = r12 + 0x20; 0x00487b0a mov qword [rdi], rax | *(rdi) = rax; 0x00487b0d mov r14b, byte [rsi] | r14b = *(rsi); 0x00487b10 test r14b, r14b | | if (r14b == 0) { 0x00487b13 je 0x487d9d | goto label_2; | } 0x00487b19 mov r13, rdi | r13 = rdi; 0x00487b1c call 0x401d10 | rax = ctype_b_loc (); 0x00487b21 mov r15, rax | r15 = rax; 0x00487b24 mov rax, qword [rax] | rax = *(rax); 0x00487b27 lea rbx, [rbp + 1] | rbx = rbp + 1; 0x00487b2b nop dword [rax + rax] | | do { 0x00487b30 movsx rcx, r14b | rcx = (int64_t) r14b; 0x00487b34 test byte [rax + rcx*2 + 1], 0x20 | | if ((*((rax + rcx*2 + 1)) & 0x20) == 0) { 0x00487b39 je 0x487b4c | goto label_3; | } 0x00487b3b movzx r14d, byte [rbx] | r14d = *(rbx); 0x00487b3f inc rbx | rbx++; 0x00487b42 test r14b, r14b | 0x00487b45 jne 0x487b30 | | } while (r14b != 0); 0x00487b47 jmp 0x487d9d | goto label_2; | label_3: 0x00487b4c cmp r14b, 0x7b | | if (r14b != 0x7b) { 0x00487b50 jne 0x487d9d | goto label_2; | } 0x00487b56 mov cl, byte [rbx] | cl = *(rbx); 0x00487b58 test cl, cl | | if (cl == 0) { 0x00487b5a je 0x487b76 | goto label_4; | } 0x00487b5c nop dword [rax] | | do { 0x00487b60 movsx rdx, cl | rdx = (int64_t) cl; 0x00487b64 test byte [rax + rdx*2 + 1], 0x20 | | if ((*((rax + rdx*2 + 1)) & 0x20) == 0) { 0x00487b69 je 0x487b78 | goto label_5; | } 0x00487b6b movzx ecx, byte [rbx + 1] | ecx = *((rbx + 1)); 0x00487b6f inc rbx | rbx++; 0x00487b72 test cl, cl | 0x00487b74 jne 0x487b60 | | } while (cl != 0); | label_4: 0x00487b76 xor ecx, ecx | ecx = 0; | label_5: 0x00487b78 mov r14, rbp | r14 = rbp; 0x00487b7b movsx rcx, cl | rcx = (int64_t) cl; 0x00487b7f test byte [rax + rcx*2 + 1], 8 | | if ((*((rax + rcx*2 + 1)) & 8) == 0) { 0x00487b84 je 0x487dd0 | goto label_6; | } 0x00487b8a mov rax, qword [rsp] | rax = *(rsp); 0x00487b8e mov rbp, qword [rax] | rbp = *(rax); 0x00487b91 mov rdi, rbx | 0x00487b94 xor esi, esi | 0x00487b96 mov edx, 0xa | 0x00487b9b call 0x401d80 | eax = strtol (rbx, 0, 0xa); 0x00487ba0 mov rdi, r12 | rdi = r12; 0x00487ba3 mov esi, eax | esi = eax; 0x00487ba5 call rbp | void (*rbp)() (); 0x00487ba7 mov rax, qword [r15] | rax = *(r15); 0x00487baa dec rbx | rbx--; 0x00487bad nop dword [rax] | | do { 0x00487bb0 movsx rcx, byte [rbx + 1] | rcx = *((rbx + 1)); 0x00487bb5 inc rbx | rbx++; 0x00487bb8 movzx edx, word [rax + rcx*2] | edx = *((rax + rcx*2)); 0x00487bbc test edx, 0x800 | 0x00487bc2 jne 0x487bb0 | | } while ((edx & 0x800) != 0); 0x00487bc4 test cl, cl | | if (cl == 0) { 0x00487bc6 je 0x487dc1 | goto label_7; | } 0x00487bcc test edx, 0x2000 | | if ((edx & 0x2000) == 0) { 0x00487bd2 je 0x487bf8 | goto label_8; | } 0x00487bd4 nop word cs:[rax + rax] | 0x00487bde nop | | do { 0x00487be0 movsx rcx, byte [rbx + 1] | rcx = *((rbx + 1)); 0x00487be5 test rcx, rcx | | if (rcx == 0) { 0x00487be8 je 0x487dc1 | goto label_7; | } 0x00487bee inc rbx | rbx++; 0x00487bf1 test byte [rax + rcx*2 + 1], 0x20 | 0x00487bf6 jne 0x487be0 | | } while ((*((rax + rcx*2 + 1)) & 0x20) != 0); | label_8: 0x00487bf8 cmp cl, 0x3a | | if (cl != 0x3a) { 0x00487bfb jne 0x487dc1 | goto label_7; | } 0x00487c01 mov cl, byte [rbx + 1] | cl = *((rbx + 1)); 0x00487c04 test cl, cl | | if (cl == 0) { 0x00487c06 je 0x487dac | goto label_9; | } 0x00487c0c add rbx, 2 | rbx += 2; | do { 0x00487c10 movsx rdx, cl | rdx = (int64_t) cl; 0x00487c14 test byte [rax + rdx*2 + 1], 0x20 | | if ((*((rax + rdx*2 + 1)) & 0x20) == 0) { 0x00487c19 je 0x487c2a | goto label_10; | } 0x00487c1b movzx ecx, byte [rbx] | ecx = *(rbx); 0x00487c1e inc rbx | rbx++; 0x00487c21 test cl, cl | 0x00487c23 jne 0x487c10 | | } while (cl != 0); 0x00487c25 jmp 0x487dac | goto label_9; | label_10: 0x00487c2a mov eax, ecx | eax = ecx; 0x00487c2c or al, 0x10 | al |= 0x10; 0x00487c2e cmp al, 0x52 | | if (al != 0x52) { 0x00487c30 jne 0x487dac | goto label_9; | } 0x00487c36 xor eax, eax | eax = 0; 0x00487c38 cmp cl, 0x52 | 0x00487c3b setne al | al = (cl != 0x52) ? 1 : 0; 0x00487c3e mov qword [r12], rax | *(r12) = rax; 0x00487c42 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x00487c45 movups xmmword [r12 + 8], xmm0 | __asm ("movups xmmword [r12 + 8], xmm0"); 0x00487c4b mov al, byte [rbx] | al = *(rbx); 0x00487c4d test al, al | | if (al == 0) { 0x00487c4f je 0x487c8d | goto label_11; | } 0x00487c51 inc rbx | rbx++; 0x00487c54 lea rcx, [r12 + 8] | rcx = r12 + 8; 0x00487c59 mov rdx, qword [r15] | rdx = *(r15); 0x00487c5c nop dword [rax] | | do { 0x00487c60 movsx rsi, al | rsi = (int64_t) al; 0x00487c64 test byte [rdx + rsi*2 + 1], 0x20 | | if ((*((rdx + rsi*2 + 1)) & 0x20) == 0) { 0x00487c69 je 0x487c7a | goto label_12; | } 0x00487c6b movzx eax, byte [rbx] | eax = *(rbx); 0x00487c6e inc rbx | rbx++; 0x00487c71 test al, al | 0x00487c73 jne 0x487c60 | | } while (al != 0); 0x00487c75 dec rbx | rbx--; 0x00487c78 jmp 0x487c8d | goto label_11; | label_12: 0x00487c7a cmp al, 0x2e | | if (al == 0x2e) { 0x00487c7c je 0x487d91 | goto label_13; | } 0x00487c82 dec rbx | rbx--; 0x00487c85 cmp al, 0x7d | | if (al == 0x7d) { 0x00487c87 je 0x487d7c | goto label_14; | } | label_11: 0x00487c8d mov rax, qword [r13] | rax = *(r13); 0x00487c91 mov qword [r12 + 8], rax | *((r12 + 8)) = rax; 0x00487c96 mov rdi, r13 | rdi = r13; 0x00487c99 mov rsi, rbx | rsi = rbx; 0x00487c9c mov rdx, qword [rsp] | rdx = *(rsp); 0x00487ca0 call 0x487af0 | rax = char const*ggParseNode(IntNode**,char const*,void(*const&)(IntNode*,int)) (); | goto label_0; 0x00487ca5 mov rbx, rax | rbx = rax; 0x00487ca8 mov rax, qword [r12 + 8] | rax = *((r12 + 8)); 0x00487cad mov rcx, qword [rax] | rcx = *(rax); 0x00487cb0 and ecx, 1 | ecx &= 1; 0x00487cb3 or rcx, r12 | rcx |= r12; 0x00487cb6 mov qword [rax], rcx | *(rax) = rcx; | label_1: 0x00487cb9 mov cl, byte [rbx] | cl = *(rbx); 0x00487cbb test cl, cl | | if (cl == 0) { 0x00487cbd je 0x487db3 | goto label_15; | } 0x00487cc3 mov rax, qword [r15] | rax = *(r15); 0x00487cc6 inc rbx | rbx++; 0x00487cc9 nop dword [rax] | | do { 0x00487cd0 movsx rdx, cl | rdx = (int64_t) cl; 0x00487cd4 test byte [rax + rdx*2 + 1], 0x20 | | if ((*((rax + rdx*2 + 1)) & 0x20) == 0) { 0x00487cd9 je 0x487cea | goto label_16; | } 0x00487cdb movzx ecx, byte [rbx] | ecx = *(rbx); 0x00487cde inc rbx | rbx++; 0x00487ce1 test cl, cl | 0x00487ce3 jne 0x487cd0 | | } while (cl != 0); 0x00487ce5 jmp 0x487db3 | goto label_15; | label_16: 0x00487cea cmp cl, 0x2c | | if (cl != 0x2c) { 0x00487ced jne 0x487db3 | goto label_15; | } 0x00487cf3 mov cl, byte [rbx] | cl = *(rbx); 0x00487cf5 test cl, cl | | if (cl == 0) { 0x00487cf7 je 0x487d2a | goto label_17; | } 0x00487cf9 inc rbx | rbx++; 0x00487cfc nop dword [rax] | | do { 0x00487d00 movsx rdx, cl | rdx = (int64_t) cl; 0x00487d04 test byte [rax + rdx*2 + 1], 0x20 | | if ((*((rax + rdx*2 + 1)) & 0x20) == 0) { 0x00487d09 je 0x487d17 | goto label_18; | } 0x00487d0b movzx ecx, byte [rbx] | ecx = *(rbx); 0x00487d0e inc rbx | rbx++; 0x00487d11 test cl, cl | 0x00487d13 jne 0x487d00 | | } while (cl != 0); 0x00487d15 jmp 0x487d27 | goto label_19; | label_18: 0x00487d17 cmp cl, 0x2e | | if (cl == 0x2e) { 0x00487d1a jne 0x487d27 | 0x00487d1c mov qword [r12 + 0x10], 0 | *((r12 + 0x10)) = 0; 0x00487d25 jmp 0x487d56 | | } else { | label_19: 0x00487d27 dec rbx | rbx--; | label_17: 0x00487d2a mov rax, qword [r13] | rax = *(r13); 0x00487d2e mov qword [r12 + 0x10], rax | *((r12 + 0x10)) = rax; 0x00487d33 mov rdi, r13 | rdi = r13; 0x00487d36 mov rsi, rbx | rsi = rbx; 0x00487d39 mov rdx, qword [rsp] | rdx = *(rsp); 0x00487d3d call 0x487af0 | rax = char const*ggParseNode(IntNode**,char const*,void(*const&)(IntNode*,int)) (); | goto label_0; 0x00487d42 mov rbx, rax | rbx = rax; 0x00487d45 mov rax, qword [r12 + 0x10] | rax = *((r12 + 0x10)); 0x00487d4a mov rcx, qword [rax] | rcx = *(rax); 0x00487d4d and ecx, 1 | ecx &= 1; 0x00487d50 or rcx, r12 | rcx |= r12; 0x00487d53 mov qword [rax], rcx | *(rax) = rcx; | } 0x00487d56 mov al, byte [rbx] | al = *(rbx); 0x00487d58 test al, al | | if (al == 0) { 0x00487d5a je 0x487dba | goto label_20; | } 0x00487d5c mov rcx, qword [r15] | rcx = *(r15); 0x00487d5f nop | | do { 0x00487d60 movsx rdx, al | rdx = (int64_t) al; 0x00487d64 test byte [rcx + rdx*2 + 1], 0x20 | | if ((*((rcx + rdx*2 + 1)) & 0x20) == 0) { 0x00487d69 je 0x487d78 | goto label_21; | } 0x00487d6b movzx eax, byte [rbx + 1] | eax = *((rbx + 1)); 0x00487d6f inc rbx | rbx++; 0x00487d72 test al, al | 0x00487d74 jne 0x487d60 | | } while (al != 0); 0x00487d76 jmp 0x487dba | goto label_20; | label_21: 0x00487d78 cmp al, 0x7d | | if (al == 0x7d) { 0x00487d7a jne 0x487dba | | label_14: 0x00487d7c inc rbx | rbx++; 0x00487d7f mov rax, rbx | rax = rbx; 0x00487d82 add rsp, 8 | 0x00487d86 pop rbx | 0x00487d87 pop r12 | 0x00487d89 pop r13 | 0x00487d8b pop r14 | 0x00487d8d pop r15 | 0x00487d8f pop rbp | 0x00487d90 ret | return rax; | label_13: 0x00487d91 mov qword [rcx], 0 | *(rcx) = 0; 0x00487d98 jmp 0x487cb9 | goto label_1; | label_2: 0x00487d9d mov edi, 0x497664 | 0x00487da2 mov rsi, rbp | rsi = rbp; 0x00487da5 xor eax, eax | eax = 0; 0x00487da7 call 0x401b60 | eax = printf ("Parse error *currentChar == '{': %s\n"); | label_9: 0x00487dac mov edi, 0x4976d5 | edi = "Parse error 'R' == *currentChar || 'B' == *currentChar: %s\n"; 0x00487db1 jmp 0x487dc6 | goto label_22; | label_15: 0x00487db3 mov edi, 0x497711 | edi = "Parse error ',' == *currentChar: %s\n"; 0x00487db8 jmp 0x487dc6 | | } else { | label_20: 0x00487dba mov edi, 0x497736 | edi = "Parse error '}' == *currentChar: %s\n"; 0x00487dbf jmp 0x487dc6 | goto label_22; | label_7: 0x00487dc1 mov edi, 0x4976b0 | | } | do { | label_22: 0x00487dc6 mov rsi, r14 | rsi = r14; 0x00487dc9 xor eax, eax | eax = 0; 0x00487dcb call 0x401b60 | printf ("Parse error ':' == *currentChar: %s\n"); | label_6: 0x00487dd0 mov edi, 0x497689 | edi = "Parse error isdigit(*currentChar): %s\n"; 0x00487dd5 jmp 0x487dc6 | | } while (1); | }