leal -0x61(%edx), %eax
cmpl $0x19, %eax
ja ... ;jump if edx is not between 0x61-0x7a
根据描述,上面的代码片段检查edx是否在0x61-0x7a之间。如果没有,则进行跳跃。
据我了解, ja
检查 ZF 和 CF 标志,如果它们为零,则 anf 跳转。
我认为我唯一理解的是第二行,它计算 edx-0x7a。如果edx < 0x7a,则CF设置为1,并且不进行跳转。
如何检查 edx 是否大于 0x61?一直不重置第二行CF?
让我们忘记第二行。如果 edx > 0x61 CF 为零,则将进行跳转。这与描述不符。
最佳答案
ja
表示如果高于(无符号)则跳转,而不是更大(有符号)。 Michael Petch 已经在评论中回答了这个问题,但我会稍微不同地处理它,以防有用。
在C中,这是这样做的
if ( ((unsigned)edx - 0x61U) > 0x19 )
goto ...;
对有符号值使用无符号比较可以免费得到 >= 0
,因为负有符号值会变成大的正无符号值,大于最大有符号值 (INT_MAX
),因此比较结果与高于阈值的有符号值相同。
减去0x61
(使用LEA
)会将范围从0x61-0x7a
转移到0-0x19
,从而允许一个无符号比较来检查两个边界。
2.:注意ja
上的注释讨论的是edx
的范围,而cmp
code> 正在测试 eax
(减法后)。
关于assembly - 了解 assembly 间隔检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397504/