g ++编译的程序集导致无限循环?

时间:2018-11-24 07:31:20

标签: c++ assembly

我一直在研究GNU的g ++编译器的已编译程序集,它看起来会导致无限循环(g ++ -S file.c -o out的部分输出):

javascript

除了最后一个jmp指令外,所有这些指令都是movq或计算指令,但这仅使我们回到.L3。这是以下代码的正文:

.L3:
        movq    array2(%rip), %rax
        movq    array1(%rip), %rdx
        movq    -8(%rbp), %rcx
        salq    $3, %rcx
        addq    %rcx, %rdx
        movq    (%rdx), %rdx
        andl    $1, %edx
        salq    $3, %rdx
        addq    %rdx, %rax
        movq    (%rax), %rdx
        movq    temp(%rip), %rax
        andq    %rdx, %rax
        movq    %rax, temp(%rip)
        subq    $1, -8(%rbp)
        jmp     .L3

它如何退出循环?看起来它只是减少了i(subq $ 1,-8(%rbp)),然后在没有比较的情况下重新启动。

1 个答案:

答案 0 :(得分:4)

假设ullunsigned long long,则循环永远不会结束,因为:

i >= 0

永远是真的。

注意:g++在启用警告的情况下进行编译时会报告此问题。