了解装配间隔检查

时间:2015-12-21 14:02:40

标签: assembly att

leal -0x61(%edx), %eax
cmpl $0x19, %eax
ja ...                  ;jump if edx is not between 0x61-0x7a

根据描述,上面的代码片段检查edx是否在0x61-0x7a之间。如果没有,则跳转。 据我所知ja检查ZF和CF标志,如果它们为零,则跳转。 我认为我唯一理解的是第二行,它计算edx-0x7a。如果edx< 0x7a,CF设置为1,不进行跳转。

  1. 如何检查edx是否大于0x61?不会一直重置CF的第二行吗?

  2. 让我们忘记第二行。如果edx> 0x61 CF为零,因此将进行跳转。这与描述不一致。

1 个答案:

答案 0 :(得分:2)

ja表示如果高于(无符号),而不是更高(已签名),则会跳转。 Michael Petch已经在评论中回答了这个问题,但是如果它有用的话,我会略微区别对待它。

在C中,这样做

if ( ((unsigned)edx - 0x61U) > 0x19 )
    goto ...;

对签名值使用无符号比较可免费提供>= 0,因为负有符号值会变为大的正无符号值,大于最大有符号值(INT_MAX),因此比较将具有与签名值高于阈值的结果相同。

减去0x61(使用LEA)将范围从0x61-0x7a移至0-0x19,允许单个无符号比较检查两个边界。

2。:请注意ja上的评论是关于edx的范围,而cmp正在测试eax (扣除后)。