gpt4 book ai didi

c - 理解程序集 : -O2 if branching

转载 作者:行者123 更新时间:2023-12-02 05:23:05 26 4
gpt4 key购买 nike

我刚刚使用 if 语句尝试了一个简单的 C 程序并分析了它的程序集。但是,当使用 -O2 标志进行编译时,它的行为有很大不同。

相同的 C 代码是:-

#include<stdio.h>

int main(int argc, char **argv) {
int a;

if(a<0) {
printf("A is less than 0\n");
}
}

对应的程序集是:-

main:
push %ebp
mov %ebp, %esp
sub %esp, 8
and %esp, -16
sub %esp, 16
test %eax, %eax
js .L4
leave
ret
.p2align 4,,15
.L4:
sub %esp, 12
push OFFSET FLAT:.LC0
call puts
add %esp, 16
leave
ret
.size main, .-main
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.6"

我读到 test 指令基本上只是执行两个操作数的逻辑与。我还读到,当前一条指令中的符号发生变化时,js 指令会执行跳转。因此,用 eax 测试 eax 将得到 01,跳转将取决于此。

我不明白它是如何在这里用于分支的。有人可以解释一下这是如何工作的吗?

最佳答案

JS在符号变化时不跳转,如果符号标志为1则跳转。

如果最后一次运算的结果为负数(2 的补码中的负数在 1 中的最高有效位),则符号位打开。

因此,如果 AND 运算是在两个负整数(-1 和 -1)之间进行的,则最后一位将为 1(符号标志),因此将进行跳转。如果数字为正,最后一位将为 0,则不会进行跳跃。

关于c - 理解程序集 : -O2 if branching,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4658925/

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