我最近正在阅读 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) 去哪儿了?我看不到任何判断。
最佳答案
这些都是非常基本的问题,您自己的一些研究应该可以回答所有这些问题。无论如何,
e
寄存器是r
寄存器的低 32 位。您可以根据需要选择一个尺寸。还有 16 位和 8 位寄存器。查阅基本架构手册。and
指令修改了它的参数,它不是a = b & c
,而是a &= b
。shrq $1, %rdi
是有效的,shrq %rdi
只是它的别名。jne
如果结果为零,则自动检查先前由shrq
设置的零标志。
关于c++ - 理解以下来自CSAPP的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47024617/