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,不进行跳转。
如何检查edx是否大于0x61?不会一直重置CF的第二行吗?
让我们忘记第二行。如果edx> 0x61 CF为零,因此将进行跳转。这与描述不一致。
答案 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
(扣除后)。