gpt4 book ai didi

将 for 循环转换为汇编而不进行初始测试

转载 作者:行者123 更新时间:2023-11-30 21:22:39 25 4
gpt4 key购买 nike

函数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 指令。所以我编辑了我原来的问题,我希望有些人不会混淆我的问题。对他们感到抱歉。

最佳答案

条件跳转仅检查条件代码(在本例中为 ZF),因此并不总是需要遵循 cmp 。而条件代码由 cmp 设置,它们也由其他操作设置,包括 addsub ,当结果为零时,它将设置 ZF 标志。

看来%rdi对应x ,它遵循典型的参数传递约定。 val<<1转换为等效的 addq %rax, %rax .

您可以看到按位与和按位或指令( andl $1, %ecxorq %rcx, %rax )。分配给val已完成 or .

那么你就有x>>=1shrq %rdi接下来是循环条件并返回。

关于将 for 循环转换为汇编而不进行初始测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52796885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com