assembly - 了解 assembly 间隔检查

标签 assembly att

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,并且不进行跳转。

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

  2. 让我们忘记第二行。如果 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/

相关文章:

c - 内联汇编未知

linux - FASM:字符串存储和控制台输出

c++ - 32 位到 64 位内联汇编移植

c++ - 使用内联汇编获取变量地址

C++转汇编语言

内联汇编的 gcc 编译错误 : operand type mismatch for ljmp

c++ - C++ 和汇编程序之间的 Scanf 函数

assembly - 英特尔和 AT&T 汇编语法在 TextMate 中突出显示

c - RDTSC 和系统调用、sys_read 和 sys_write

assembly - "mov offset(%rip), %rax"是做什么的?