Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cmp je/jg它们在装配中的工作方式_C_Assembly_X86_Conditional Statements_Cmp - Fatal编程技术网

cmp je/jg它们在装配中的工作方式

cmp je/jg它们在装配中的工作方式,c,assembly,x86,conditional-statements,cmp,C,Assembly,X86,Conditional Statements,Cmp,我想了解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)

我想了解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)
是对x86控制流指令的一个很好的总结

此外,没有理由对相同的值重复cmp指令。一旦执行了它,就可以通过多种方式测试结果,而无需重复比较。因此,您的汇编代码应该如下所示:

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

是的,这是正确的,除了在第三个示例中的C代码中有
*x
,但在其他示例中有
x
,这是没有意义的。在汇编代码中没有相应的代码

在C语言中,变量类型(有符号/无符号)是在声明变量时定义的,例如
int x
unsigned int x
,但在汇编语言中,有符号和无符号变量(无论是在内存中还是在寄存器中)之间的区别是通过不同的条件跳转进行比较的:

对于有符号变量:

jg  ; jump if greater
jl  ; jump if less
jge ; jump if greater or equal, "jnl" is synonymous
jle ; jump if less or equal, "jng" is synonymous
ja  ; jump if above
jb  ; jump if below
jae ; jump if above or equal, "jnb" is synonymous
jbe ; jump if below or equal, "jna" is synonymous
对于无符号变量:

jg  ; jump if greater
jl  ; jump if less
jge ; jump if greater or equal, "jnl" is synonymous
jle ; jump if less or equal, "jng" is synonymous
ja  ; jump if above
jb  ; jump if below
jae ; jump if above or equal, "jnb" is synonymous
jbe ; jump if below or equal, "jna" is synonymous

列出了
x86
程序集中可用的所有条件跳转,以及它们的条件(标志值)和用于短跳转和长跳转的操作码。

您可能已经知道,处理器在所谓的标志寄存器中跟踪上一次操作期间发生的内容。 例如,如果操作溢出或结果为零等,则会有一个标志。cmp助记符告诉处理器减去两个寄存器/寄存器和内存内容,并更改正确的标志。
之后,你可以使用你所做的跳跃进行跳跃。处理器检查标志是否等于je(检查零标志),或者它是否更小/更大(溢出标志表示无符号和溢出,符号标志表示有符号的数字)。

进位标志用于指示无符号溢出。溢出标志用于指示签名溢出。为了进行比较,将检查标志的组合:CF和ZF表示无符号,SF、of表示有符号,ZF表示有符号。如果您不确定,您可以在手册中快速重复检查。