函数test_two
具有以下总体结构:
long test_two(unsigned long x) {
long val = 0;
int i;
for(i=64; i != 0; i--) {
val = (val<<1)|(x & 0x1);
x>>=1;
}
return val;
}
gcc C编译器生成以下汇编代码:
test_two:
movl $64, %edx
movl $0, %eax
.L10:
movq %rdi, %rcx
andl $1, %ecx
addq %rax, %rax
orq %rcx, %rax
shrq %rdi
subq $1, %rdx
jne .L10
rep ret
我对cmp指令有误解。因此,我编辑了原始问题,希望某些人不要混淆我的问题。抱歉。
答案 0 :(得分:2)
条件跳转仅检查条件代码(在这种情况下为ZF),因此不必始终遵循cmp
。条件代码由cmp
设置,但它们也由其他操作设置,包括add
和sub
,它们将在结果为零时设置ZF标志。
似乎%rdi
对应于x
,遵循典型的参数传递约定。 val<<1
已转换为等效的addq %rax, %rax
。
您可以看到按位和和或指令(andl $1, %ecx
和orq %rcx, %rax
)。对val
的分配是通过or
完成的。
然后将x>>=1
设为shrq %rdi
,然后加上循环条件并返回。