# command: r2 -e scr.color=0 -qc 'aaa; afl; pdf @ sym.div10s; pdc @ sym.div10s; pdf @ sym.table_switch; pdc @ sym.table_switch; pdf @ sym.mod8s; pdc @ sym.clamp_max; pdc @ sym.mod10s' idioms-x86_64-O2.o # version: radare2 6.2.4 +0 abi:152 @ darwin-arm_64 HINT: Relocs not applied, some references may not resolve: use -e bin.relocs.apply=true INFO: Analyze all flags starting with sym. and entry0 (aa) INFO: Analyze imports (af@@@i) INFO: Name local plt stubs from their got relocs (anal.plt) INFO: Analyze symbols (af@@@s) INFO: Running plugin pre-analysis hooks INFO: Analyze all functions arguments/locals (afva@@F) INFO: Analyze function calls (aac) INFO: Analyze len bytes of instructions for references (aar) ERROR: invalid memory at 0x08000868 INFO: Finding and parsing C++ vtables (avrr) INFO: Analyzing methods (af @@ method.*) INFO: Recovering local variables (afva@@@F) INFO: Type matching analysis for all functions (aaft) INFO: Propagate noreturn information (aanr) INFO: Use -AA or aaaa to perform additional experimental analysis 0x08000040 1 16 sym.div10u 0x08000050 1 24 sym.div10s 0x08000070 1 23 sym.div7u 0x08000090 1 24 sym.div3s 0x080000b0 1 31 sym.mod10s 0x080000d0 1 16 sym.mod8s 0x080000e0 1 4 sym.mul9 0x080000f0 1 19 sym.linear_switch 0x08000110 3 23 sym.table_switch 0x08000130 3 24 sym.call_switch 0x08000160 12 68 sym.sparse_switch 0x080001b0 1 23 sym.two_cases 0x080001d0 1 8 sym.clamp_max 0x080001e0 1 8 sym.abs_int 0x080001f0 1 8 sym.is_pos 0x08000200 2 16 sym.tail_caller 0x08000210 1 4 sym.leaf_add 0x08000220 1 6 sym.twice_sum 0x08000230 10 140 sym.sum_n 0x080002c0 1 27 sym.sum4 0x080002e0 1 73 sym.poly8 0x08000330 3 14 sym.fill 0x08000340 2 16 sym.copy_n 0x08000350 1 7 sym.copy16 0x08000360 11 230 sym.digest ┌ 24: sym.div10s (int64_t arg1); │ `- args(rdi) │ 0x08000050 4863c7 movsxd rax, edi ; arg1 │ 0x08000053 4869c06766.. imul rax, rax, 0x66666667 │ 0x0800005a 4889c1 mov rcx, rax │ 0x0800005d 48c1e93f shr rcx, 0x3f │ 0x08000061 48c1f822 sar rax, 0x22 │ 0x08000065 01c8 add eax, ecx └ 0x08000067 c3 ret // callconv: rax amd64 (rdi, rsi, rdx, rcx, r8, r9, stack); void sym.div10s (int64_t arg1) { rax = edi // arg1 rax = rax * 0x66666667 rcx = rax rcx >>>= 0x3f rax >>= 0x22 eax += ecx return } ┌ 23: sym.table_switch (uint64_t arg1); │ `- args(rdi) │ 0x08000110 b8ffffffff mov eax, 0xffffffff ; -1 │ 0x08000115 83ff06 cmp edi, 6 ; 6 ; arg1 │ ┌─< 0x08000118 770c ja 0x8000126 │ │ 0x0800011a 89f8 mov eax, edi ; arg1 │ │ 0x0800011c 488d0d0000.. lea rcx, [0x08000123] ; RELOC 32 .rodata @ 0x08000460 - 0x80000fb │ │ ; DATA XREF from sym.table_switch @ 0x800011c(r) │ │ 0x08000123 8b0481 mov eax, dword [rcx + rax*4] │ │ ; CODE XREF from sym.table_switch @ 0x8000118(x) └ └─> 0x08000126 c3 ret // callconv: rax amd64 (rdi, rsi, rdx, rcx, r8, r9, stack); void sym.table_switch (uint64_t arg1) { eax = 0xffffffff // -1 v = edi - 6 // 6 // arg1 if (((unsigned) v) <= 0) { eax = edi // arg1 rcx = rip // 0x8000123; RELOC 32 .rodata @ 0x08000460 - 0x80000fb // DATA XREF from sym.table_switch @ 0x800011c(r) eax = dword [rcx + rax*4] } // CODE XREF from sym.table_switch @ 0x8000118(x) return } ┌ 16: sym.mod8s (int64_t arg1); │ `- args(rdi) │ 0x080000d0 89f8 mov eax, edi ; arg1 │ 0x080000d2 8d4807 lea ecx, [rax + 7] │ 0x080000d5 85ff test edi, edi ; arg1 │ 0x080000d7 0f49cf cmovns ecx, edi ; arg1 │ 0x080000da 83e1f8 and ecx, 0xfffffff8 ; 4294967288 │ 0x080000dd 29c8 sub eax, ecx └ 0x080000df c3 ret // callconv: rax amd64 (rdi, rsi, rdx, rcx, r8, r9, stack); void sym.clamp_max (uint64_t arg1, int64_t arg2) { eax = esi // arg2 v = edi - esi // arg2 cmovg eax edi // arg1 return edi } // callconv: rax amd64 (rdi, rsi, rdx, rcx, r8, r9, stack); void sym.mod10s (int64_t arg1, int64_t arg2) { rax = edi // arg1 rcx = rax * 0x66666667 rdx = rcx // arg2 rdx >>>= 0x3f rcx >>= 0x22 // arg2 ecx += edx // arg2 ecx += ecx // arg2 ecx = rcx + rcx*4 // arg2 eax -= ecx // arg2 return ecx }