我只是装配编程的新手。我有一个整数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
并设置SF
,ZF
,PF
,CF
,{{1} }和/或OF
适当标记。我也了解AF
会检查jl
条件。 这里的SF <> OF
运算符是什么?
The reference I used表示<>
将使用指定的参数加载jl
,对于EIP
,
该引用还说cmp arg2, arg1
时jl
不会跳转。
我的第二个问题是,arg2 == arg1
jl
和arg2 <= arg1
if(a <= 0)
时arg2 < arg1
不应该if(a < -1)
跳? / p>
有人可以帮我理解这个吗?
答案 0 :(得分:1)
<>
运算符表示“不等于”,即与C中的!=
相同。
在if(a&lt; = 0)的情况下,当arg2&lt; = arg1时,不应该jl跳转
您的条件是a >= 0
,而不是a <= 0
。 jl
所做的是跳过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: