1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
# OBJDUMP
0000000000400fce <func4>:
400fce: 48 83 ec 08 sub $0x8,%rsp
400fd2: 89 d0 mov %right,%range
400fd4: 29 f0 sub %left,%range
400fd6: 89 c1 mov %range,%mid
400fd8: c1 e9 1f shr $0x1f,%mid
400fdb: 01 c8 add %mid,%range
400fdd: d1 f8 sar $1,%range
400fdf: 8d 0c 30 lea (%range,%left,1),%mid
400fe2: 39 f9 cmp %input,%mid
# range = right - left
# mid = left + (range/2)
400fe4: 7e 0c jle 400ff2 <func4+0x24> # if (mid > input), left part
# left part
# [left, mid-1]
400fe6: 8d 51 ff lea -0x1(%mid),%right # right = mid - 1
400fe9: e8 e0 ff ff ff call 400fce <func4>
400fee: 01 c0 add %range,%range # range = 2 * range
400ff0: eb 15 jmp 401007 <func4+0x39>
# right part
# [mid+1, right]
400ff2: b8 00 00 00 00 mov $0x0,%range
400ff7: 39 f9 cmp %input,%mid
400ff9: 7d 0c jge 401007 <func4+0x39> # if (mid >= input) ret
400ffb: 8d 71 01 lea 0x1(%mid),%left # left = mid + 1
400ffe: e8 cb ff ff ff call 400fce <func4>
401003: 8d 44 00 01 lea 0x1(%range,%range,1),%range # range = 2*range + 1
401007: 48 83 c4 08 add $0x8,%rsp
40100b: c3 ret # ret range (eax)
# all caller saved
# range --- eax
# left --- esi
# right --- edx
# input --- rdi (constant)
|