无需初始测试即可将循环转换为装配体

时间:2018-10-13 20:08:19

标签: c for-loop assembly x86-64

函数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指令有误解。因此,我编辑了原始问题,希望某些人不要混淆我的问题。抱歉。

1 个答案:

答案 0 :(得分:2)

条件跳转仅检查条件代码(在这种情况下为ZF),因此不必始终遵循cmp。条件代码由cmp设置,但它们也由其他操作设置,包括addsub,它们将在结果为零时设置ZF标志。

似乎%rdi对应于x,遵循典型的参数传递约定。 val<<1已转换为等效的addq %rax, %rax

您可以看到按位和和或指令(andl $1, %ecxorq %rcx, %rax)。对val的分配是通过or完成的。

然后将x>>=1设为shrq %rdi,然后加上循环条件并返回。