我想了解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:
    ......

最佳答案

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

if (*x == 1)

应该是
if (x == 1)

Here是x86控制流指令的一个很好的摘要。
同样,没有理由对相同的值重复cmp指令一旦您执行了它,就可以通过多种方式测试结果,而无需重复比较。所以程序集代码应该如下所示:
cmp    $0x3,%eax
je     A
jg     B
cmp    $0x1,%eax
je     C

关于c - cmp je/jg它们在组装中的工作方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12665289/

10-12 15:04