Conditional Move;以操作码(条件码)区分不同的移动条件。
opcode 以 0F 4* 打头;
/*509a: eb 0b jmp 50a7 <__sprintf_chk@plt+0x2937>
509c: 0f 1f 40 00 nopl 0x0(%rax)*/
for (i = 0; i < 8; i++) {
/*50a0: 48 8b 03 mov (%rbx),%rax // rax=gvar_8ba0[1]="ipc"
50a3: 48 83 c3 08 add $0x8,%rbx // rbx=gvar_8ba0[2]
50a7: 48 83 ec 08 sub $0x8,%rsp // 0x7fffffff9548
50ab: b9 32 00 00 00 mov $0x32,%ecx // ecx=0x32
50b0: 41 89 e9 mov %ebp,%r9d // r9d=ebp=pid
50b3: 4c 89 ff mov %r15,%rdi // rdi=buff
50b6: 50 push %rax // 0x7fffffff9540:0x000055555555a117, 此为传参
50b7: 4c 8d 05 60 10 00 00 lea 0x1060(%rip),%r8 # 611e <_IO_stdin_used@@Base+0x11e> // "/proc/%i/ns/%s"
50be: ba 01 00 00 00 mov $0x1,%edx // edx=1
50c3: 31 c0 xor %eax,%eax // eax=0
50c5: be 32 00 00 00 mov $0x32,%esi // esi=32
50ca: e8 21 d3 ff ff callq 23f0 <__snprintf_chk@plt>*/
sprintf(buff, "/proc/%i/ns/%s", temp->pid, gvar_8ba0[i]);
/*50cf: 4c 89 f2 mov %r14,%rdx // rdx=r14=st
50d2: 4c 89 fe mov %r15,%rsi // buff="/proc/1/ns/cgroup"
50d5: bf 01 00 00 00 mov $0x1,%edi // edi
50da: e8 41 d5 ff ff callq 2620 <__xstat@plt>*/
if (__xstat(1, buff, &st)) {
temp->ns[i] = 0;
continue;
}
/*50df: 5a pop %rdx // rdx=0x000055555555a117, rsp=0x7fffffff9548
50e0: 59 pop %rcx // rcx=0x555555559025, rsp=0x7fffffff9550
50e1: 85 c0 test %eax,%eax
50e3: b8 00 00 00 00 mov $0x0,%eax
50e8: 48 0f 44 44 24 08 cmove 0x8(%rsp),%rax // rsp+0x8=0x7fffffff9558, cmove:Move if equal (ZF=1)
50ee: 49 83 c5 08 add $0x8,%r13 // r13=temp->ns[1], temp->ns[2], ...
50f2: 49 89 45 f8 mov %rax,-0x8(%r13)*/// temp->ns[1] = rax
temp->ns[i] = st.st_ino; // __xstat返回值eax为零时才执行,不为零时继续for循环,此处隐含了上面的 continue 语句。
/*50f6: 48 8d 05 db 3a 00 00 lea 0x3adb(%rip),%rax # 8bd8 <_IO_stdin_used@@Base+0x2bd8> rax=gvar_8ba0[1]
50fd: 48 39 c3 cmp %rax,%rbx // 8bd8-8ba0=0x38, 0x38/8=7
5100: 75 9e jne 50a0 <__sprintf_chk@plt+0x2930>*/
} /* for (i = 0; i < 8; i++) end */