【问题标题】:How flow is controlled in the posted assembly code?在发布的汇编代码中如何控制流程?
【发布时间】:2021-12-10 05:55:27
【问题描述】:

我正在学习汇编代码。这是一段我不完全理解的代码

0: move %rdi, %rax
3: jmp  8 <loop + 0x8>
5: sar  %rax
8: test %rax, %rax
b: jg   5 <loop + 0x5>
d: repz retq

所以 CPU 先运行第 0 行,然后从第 3 行跳转到第 8 行。假设第 b 行运行,则执行跳转到第 5 行。我的问题是执行如何从第 5 行跳转到第 d 行?我假设在第 5 行之后还有另一个 jmp 代码,以便执行可以跳转到第 d 行,但我没有看到它。

【问题讨论】:

    标签: assembly x86-64 flow-control


    【解决方案1】:

    嗯,我想我了解执行流程。在第 5 行之后,执行将在运行 d 之前再次运行 8 和 b。它本质上是一个循环,而不是一个条件流。

    【讨论】:

    • 是的,大多数向后的条件分支是循环的底部。 Why are loops always compiled into "do...while" style (tail jump)? 这可能是来自gcc -O1 的编译器输出,尽管这是一个非常奇怪/效率低下的函数,相当于return x&gt;0 ? 0 : x;。我猜 GCC 的优化器不会寻求这种简化,因为大多数程序员首先会避免编写该循环的 C 版本。啊,但至少gcc -O2 和更高版本能够避免循环中的testgodbolt.org/z/K5r77rK67
    猜你喜欢
    • 2019-10-11
    • 2010-12-07
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多