【发布时间】:2015-12-21 14:02:39
【问题描述】:
leal -0x61(%edx), %eax
cmpl $0x19, %eax
ja ... ;jump if edx is not between 0x61-0x7a
根据描述上面的代码sn-p检查edx是否在0x61-0x7a之间。如果没有,则进行跳转。
据我了解ja 检查 ZF 和 CF 标志,如果它们为零,则 anf 跳转。
我认为我唯一理解的是第二行,它计算 edx-0x7a。如果edx
如何检查 edx 是否大于 0x61?不是一直重置第二行CF吗?
让我们忘记第二行。如果 edx > 0x61 CF 为零,则跳转。这与描述不符。
【问题讨论】:
-
这有点小技巧。需要注意的关键是,您通过从 EDX 中减去 0x61,有效地将范围结束检查的底部标准化为 0x00。这里的关键部分是 JA 基于 unsigned 比较。因此,您将归一化范围的顶端与 0x19 进行比较。如果 unsigned 比较(无符号很重要)高于 0x19,则 EDX 最初在 0x61 到 0x7a 之外。
-
您可能会问如果 EDX 最初低于 0x61 会发生什么。减法会使它们变为负数,但是无符号比较会将它们视为具有最高有效位集的非常大的整数。例如,如果 EDX 中有 0x60。 0x60-0x61=-1。 -1 = 0xFFFFFFFF。作为一个环绕到整数范围高端的无符号数。