bomb lab 第六关详细分析
由于第六关的汇编代码太长且复杂,需要非常耐心地进行分析,故将整个汇编代码分为几个部分详细说明。
一、Part1
00000000004010f4 <phase_6>:
// arg1=input(input是从外部传入的字符串)
4010f4: 41 56 push %r14
4010f6: 41 55 push %r13
4010f8: 41 54 push %r12
4010fa: 55 push %rbp
4010fb: 53 push %rbx
4010fc: 48 83 ec 50 sub $0x50,%rsp
401100: 49 89 e5 mov %rsp,%r13
401103: 48 89 e6 mov %rsp,%rsi
401106: e8 51 03 00 00 callq 40145c <read_six_numbers>
// read_six_numbers
int read_six_numbers(input,a)
{
//input是phase_6的参数1,a是在栈中分配的一个int*数组
return (sscanf(input,"%d %d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]));
}
//
40110b: 49 89 e6 mov %rsp,%r14
40110e: 41 bc 00 00 00 00 mov $0x0,%r12d
>>>>>>>>>>>>>>>>>>>>>>>>>>> 循环开始<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 令 r12d<=>i , rbx<=>j (后面注释的i和j代表这两个寄存器的值)
401114: 4c 89 ed mov %r13,%rbp
401117: 41 8b 45 00 mov 0x0(%r13),%eax # eax=a[i]
40111b: 83 e8 01 sub $0x1,%eax # eax -= 1
40111e: 83 f8 05 cmp $0x5,%eax
401121: 76 05 jbe 401128 <phase_6+0x34>
// if (eax>=0 && eax<=5) -> jmp else -> bomb (所以eax必须在区间[0,5])
401123: e8 12 03 00 00 callq 40143a <explode_bomb>
401128: 41 83 c4 01 add $0x1,%r12d # i++
// r12d一开始为0,这边加1,感觉会是个用于循环的计数器
40112c: 41 83 fc 06 cmp $0x6,%r12d
401130: 74 21 je 401153 <phase_6+0x5f> # 等于6时跳出循环
401132: 44 89 e3 mov %r12d,%ebx # 否则继续,j初始化=i+1
>>>>>>>>>>>>>>>>>>>>>>>>>>> 内循环开始<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
401135: 48 63 c3 movslq %ebx,