2011-04-04 125 views
2

我在理解这个问题时遇到问题。它的英特尔语法cmp和ja问题

cmp eax, 0x19 
ja greater 

eax包含值-40。 http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow告诉我ja是从前一个cmp的无符号比较。

据我所知,这应该跳IF ARG1(0x19)高于ARG2(0xffffffd8)

0x19看起来小于0xffffffd8给我。正在执行跳转。任何帮助理解我的有缺陷的逻辑非常感谢!

回答

6

这有点难以回答,因为不同的汇编器颠倒了操作数的顺序。从外观看,你似乎在使用英特尔语法汇编,在这种情况下,你拥有的大致相当于if (unsigned)eax > 0x19 goto greater。既然如此,跳跃就是合理的。

+0

非常感谢。网页上的信息令人困惑。它显示英特尔语法为cmp arg2,arg1,然后如果“第一次操作”高于第二次,则表示ja jump。它没有指定语法 – flumpb 2011-04-04 16:39:36

+4

@kisplit:如果考虑到'cmp a,b'等同于'sub a,b',可能会更容易一些,除了它只改变标志,其中'sub'改变标志*和*将差异放在'a'中。 – 2011-04-04 16:50:52

0

也许,0xffffffd8是二进制补码32位的负数。 0x19是肯定的。