c++ - 理解以下来自CSAPP的汇编代码

标签 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. e 寄存器是r 寄存器的低 32 位。您可以根据需要选择一个尺寸。还有 16 位和 8 位寄存器。查阅基本架构手册。
  2. and指令修改了它的参数,它不是a = b & c,而是a &= b
  3. shr​​q $1, %rdi 是有效的,shr​​q %rdi 只是它的别名。
  4. jne 如果结果为零,则自动检查先前由 shr​​q 设置的零标志。

关于c++ - 理解以下来自CSAPP的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47024617/

相关文章:

assembly - 为什么在 Mips 架构中寄存器 $a1 总是打印 0

c++ - 从 C++ 中的任何类型的文件中读取字节及其十进制值

c++ - Qt on RaspberryPi - QXmlAttributes 隐式声明

c - 带关系运算符的 while 循环

c - 在c中声明大小数组

c - C 中的非法汇编指令

c++ - 从类方法 C++0x 返回 unique_ptr

c++ - 格式化没有这样的文件或目录

c - 使用 select() 函数发送和接收数据

c - 使用 PPC 程序集引用其他文件中的符号