首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GDB / GNU程序集:测试%esi,%esi返回不相等?

GDB / GNU程序集:测试%esi,%esi返回不相等?
EN

Stack Overflow用户
提问于 2013-10-07 03:56:02
回答 2查看 3K关注 0票数 1

我在做作业。我们得到了一个预编译的二进制文件,我们必须使用gdb来获取程序集转储、遍历数据结构、查看存储在内存中的值等,以便弄清楚二进制文件的作用。下面是函数调用中反汇编程序转储的几行代码:

代码语言:javascript
复制
0x08048e14 <+21>:   test   %esi,%esi
0x08048e16 <+23>:   jne    0x8048e4b <fun6+76>
0x08048e18 <+25>:   jmp    0x8048e5d <fun6+94>

我假设test %esi,%esi总是返回“等于”的结果(或者,更确切地说,使用寄存器标志表示的等价语句(我认为只有ZF设置了?),并且jne指令永远不会执行,相反,程序将在<+25>行执行指令。但是,在完成这些指令之后,程序跳到了行<+76>!这一切为什么要发生?我太困惑了。

为了帮助解释答案,下面是test指令之后的<+21>行(ZF未设置?)之后的寄存器标志(我仍然不知道如何准确地解释标志):

代码语言:javascript
复制
eflags         0x202    [ IF ]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-07 04:19:41

test指令按位执行AND,但不存储结果;它只设置标志。

jne实际上是“如果ZF不等于0的话跳”,所以这里测试esi是否为零。

还请参阅 instruction work? instruction do?

票数 7
EN

Stack Overflow用户

发布于 2013-10-07 04:16:31

我想我已经找到了答案:

testl b,a就像计算a&b而不设置目标一样。ZF设置为a&b == 0.

换句话说,我想到的是cmp指令,这显然不同于test

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19216813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档