cmp je/jg他们如何在装配中工作

Fra*_*nXh 1 c x86 assembly cmp conditional-statements

我想了解cmp和je/jg如何在汇编中工作.我在谷歌上看到了一些例子,但我仍然有点困惑.下面我展示了我试图转换为C语言和相应C代码的汇编代码的一部分.它是以正确的方式实现还是我对cmp如何工作有错误的理解?

cmp    $0x3,%eax
je     A
cmp    $0x3,%eax
jg     B
cmp    $0x1,%eax
je     C


 int func(int x){


  if(x == 3)
    goto A;

  if (x >3)
    goto B;


  if(x == 1)
     goto C;

    A:
    ......

    B:
    ......

    C:
    ......
Run Code Online (Sandbox Code Playgroud)

Car*_*ory 5

您正确理解cmp和je/jg是如何工作的,但您的C代码中有错误.这一行:

if (*x == 1)
Run Code Online (Sandbox Code Playgroud)

应该

if (x == 1)
Run Code Online (Sandbox Code Playgroud)

是x86控制流指令的一个非常好的总结.

此外,没有理由为相同的值重复cmp指令.执行完毕后,您可以多种方式测试结果,而无需重复比较.所以你的汇编代码应如下所示:

cmp    $0x3,%eax
je     A
jg     B
cmp    $0x1,%eax
je     C
Run Code Online (Sandbox Code Playgroud)