深入了解计算机系统(CSAPP)练习题3.16

  • exercise 3.16
    已知下列C代码
    void cond(long a, long *p) {
        if (p && a > *p) 
            *p = a;
    }
    
    GCC会产生下面的汇编代码
    cond:
        testq   %rsi, %rsi
        je      .L1
        cmpq    %rdi, (%rsi)
        jge     .L1
        movq    %rdi, (%rsi)
    .L1
        rep; ret
    
    • 疑惑: if (p && a > *p)为何会在汇编语言中产生cmpq %rdi, (%rsi)? p && a在汇编中为何没有反映出来
    • 解答: 运算符的优先级在书中没有讲到, >的优先级大于&&的优先级, 因此上面的代码片段应理解为: if (p && (a > *p)), 其中a > *pcmpq %rdi, (%rsi)中反映出来. 而p && ()在汇编中等价于testq %rsi, %rsi je .L1 ..., 即当p不为空且a > *p不为零时, 执行cmpq %rdi, (%rsi)否则结束程序

你可能感兴趣的:(深入了解计算机系统(CSAPP)练习题3.16)