个人技术分享

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