在这种情况下使用JL和JLE?

时间:2013-04-30 07:53:03

标签: c assembly x86 disassembly

我只是装配编程的新手。我有一个整数a。我试图了解

之间是否存在任何性能差异
if(a >= 0)

if(a > -1)

所以,我继续拆解上面的内容。在我的x86机器中,

if(a >= 0)

反汇编:

cmp         dword ptr [ebp-4],0
jl          main+43h (00401053)

if(a > -1)

反汇编:

cmp         dword ptr [ebp-4],0FFh
jle         main+43h (00401053)

我可以快速编写一个程序来计算这些程序的CPU周期(尚未完成)。但是,我现在面临着另一个问题。

我了解cmp将执行sub并设置SFZFPFCF,{{1} }和/或OF适当标记。我也了解AF会检查jl条件。 这里的SF <> OF运算符是什么?

The reference I used表示<>将使用指定的参数加载jl,对于EIP

  1. arg2&lt; arg1并且操作没有溢出
  2. arg2&lt; arg1并且操作有溢出
  3. 该引用还说cmp arg2, arg1jl不会跳转。

    我的第二个问题是,arg2 == arg1 jlarg2 <= arg1 if(a <= 0)arg2 < arg1不应该if(a < -1)跳? / p>

    有人可以帮我理解这个吗?

1 个答案:

答案 0 :(得分:1)

<>运算符表示“不等于”,即与C中的!=相同。

  在if(a&lt; = 0)

的情况下,当arg2&lt; = arg1时,

不应该jl跳转

您的条件是a >= 0,而不是a <= 0jl所做的是跳过a >= 0时将执行的代码块。

即。像这样的东西:

cmp a,0   
jl end_if  ; jump past the body of the if-statement if the condition is false,
           ; i.e. a < 0
; code that should be executed if a >= 0 goes here
; ...
end_if: