gpt4 book ai didi

debugging - test 和 je/jne 如何工作

转载 作者:行者123 更新时间:2023-12-02 22:18:54 24 4
gpt4 key购买 nike

好吧,我开始进行一些组装工作。我从以下说明开始:

test       al, al
jne 0x1000bffcc

使用调试器,我希望代码不跳转到地址 0x1000bffcc,因此我在 jne 指令上设置了一个断点,然后使用以下 lldb 命令反转 al 寄存器:

expr $al = 1

这很有效,所以我继续下去,直到我偶然发现了以下非常相似的指令对:

test       al, al
je 0x1000bffcc

虽然这看起来很相似,但反转 al 寄存器似乎没有影响。它不断跳转到地址0x1000bffcc。因此,我做了一些研究,发现测试与 al 本身运行逻辑 AND,然后相应地设置零标志或 ZF。这引出了两个问题:

  • 为什么在第一个示例中反转 al 寄存器会有所帮助?
  • 为什么它在第二个示例中不起作用?
  • 如何使用调试器使第二个示例中的代码不跳转?

非常感谢您的帮助!

最佳答案

test    al, al
jne 0x1000bffcc

test 指令执行两个操作数和集合的逻辑 the CPU flags register根据结果​​(不存储在任何地方)。如果 al 为零,则与运算的结果为零并设置 Z 标志。如果al非零,则清除Z标志。 (其他标志,例如Carry、oVerflow、Sign、Parity等也受到影响,但此代码没有测试它们的指令。)

如果未设置 Z 标志,jne 指令会更改 EIP。同一操作还有另一个助记符,称为jnz

如果您让 test 指令执行,然后在条件跳转指令之前更改 al,则条件跳转仍然会执行更改之前要做的任何事情al。这是因为al的值不再影响条件跳转。如果您在测试之前更改该值,那么它将按预期工作。

至于为什么改变它有时会产生影响:一定是因为修改后的al值影响了其他逻辑。

要使用调试器使指令不跳转,请更改标志以设置 Z 标志。它可能被称为 ZF,或者您可能必须修改 EFLAGS 寄存器中的位。如何执行此操作因调试器及其版本而异。

关于debugging - test 和 je/jne 如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com