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 */