了解CSAPP中的以下汇编代码

时间:2017-10-30 21:41:01

标签: c++ c assembly

我最近正在阅读CSAPP,我对汇编代码示例有疑问。这是CSAPP的一个例子,代码如下:

    long pcount_goto
    (unsigned long x) {
    long result = 0;
    result += x & 0x1;
    x >>= 1;
    if(x) goto loop;
    return result;

 相应的汇编代码是:

   movl    $0, %eax     #  result = 0
   .L2:                 # loop:
    movq    %rdi, %rdx
    andl    $1, %edx    #  t = x & 0x1
    addq    %rdx, %rax   #  result += t
    shrq    %rdi         #  x >>= 1
    jne .L2                 #  if (x) goto loop
    rep; ret

我的问题可能看起来很幼稚,因为我对汇编代码很陌生,但我很感激有人可以帮我解决这些问题。

  1. %eax,%rax,(%edx,%rdx)之间有什么区别。我已经看到它们出现在汇编代码中,但它们似乎指的是相同的空格/地址。使用两个不同名称有什么意义?

  2. 在代码中

    andl    $1, %edx    #  t = x & 0x1
    

    据我所知,%edx现在存储了t,但x在哪里呢?

  3. 在代码中

    shrq    %rdi  
    

    我认为

     shrq   1, %rdi
    

    应该更好吗?

  4. 有关

    jne .L2                 #  if (x) goto loop
    

    if(x)在哪里?我看不出任何判断。

1 个答案:

答案 0 :(得分:2)

这些是非常基本的问题,对你自己的一点点研究应该已经回答了所有问题。无论如何,

  1. e寄存器是r寄存器的低32位。根据您需要的尺寸选择一个。还有16位和8位寄存器。请参阅基本架构手册。
  2. and指令会修改其参数,它不是a = b & c,而是a &= b
  3. 那将是shrq $1, %rdi有效,而shrq %rdi只是它的别名。
  4. 如果结果为零,
  5. jne会自动检查shrq之前设置的零标记。