我最近正在阅读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
我的问题可能看起来很幼稚,因为我对汇编代码很陌生,但我很感激有人可以帮我解决这些问题。
%eax,%rax,(%edx,%rdx)之间有什么区别。我已经看到它们出现在汇编代码中,但它们似乎指的是相同的空格/地址。使用两个不同名称有什么意义?
在代码中
andl $1, %edx # t = x & 0x1
据我所知,%edx现在存储了t,但x在哪里呢?
在代码中
shrq %rdi
我认为
shrq 1, %rdi
应该更好吗?
有关
jne .L2 # if (x) goto loop
if(x)在哪里?我看不出任何判断。
答案 0 :(得分:2)
这些是非常基本的问题,对你自己的一点点研究应该已经回答了所有问题。无论如何,
e
寄存器是r
寄存器的低32位。根据您需要的尺寸选择一个。还有16位和8位寄存器。请参阅基本架构手册。and
指令会修改其参数,它不是a = b & c
,而是a &= b
。shrq $1, %rdi
有效,而shrq %rdi
只是它的别名。jne
会自动检查shrq
之前设置的零标记。