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

程序集:何时测试%esi,%esi返回不相等?
EN

Stack Overflow用户
提问于 2017-06-21 00:48:04
回答 1查看 2.2K关注 0票数 1

从组装区开始,很难找到一份像样的教程。想找一本“傻瓜大会”的书。

我遇到了以下情况,“test”命令总是使用相同的地址或注册表运行。

代码语言:javascript
复制
0x08048e14 <+21>:   test   %esi,%esi
0x08048e16 <+23>:   jne    0x8048e4b <main+76>

既然是同一个登记处或地址,它什么时候不返回它们是相同的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-21 01:05:32

代码语言:javascript
复制
test reg, reg

(对于两个操作数,reg都是相同的),您几乎总是会看到它,而不是:

代码语言:javascript
复制
cmp  reg, 0

在优化的代码中。这两个指令都以相同的方式设置标志,但前者的编码字节较少,因此速度稍快。

因此,您的代码只是测试看看esi寄存器是否为零。如果它是非零,它接受分支;如果它是零,则执行失败而不分支。

为什么要这么做?正如您似乎已经知道的那样,TEST指令只是按位执行--并对其操作数进行操作。那么,真值表对按位表示的是什么呢?

代码语言:javascript
复制
|===============================|
|  Bit 1  |  Bit 2  ||   AND    |
|---------|---------||----------|
|    0    |    0    ||    0     |
|    1    |    0    ||    0     |
|    0    |    1    ||    0     |
|    1    |    1    ||    1     |
|===============================|

中间两种情况可以忽略,因为在这种特殊情况下,我们知道两个操作数是相同的值。因此,当esi为0时,TEST会将零标志(ZF)设置为1,因为按位表示的结果是0。相反,当esi为非零时,TEST将关闭零标志,因为如果按位的结果是非零的话。

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

https://stackoverflow.com/questions/44665151

复制
相关文章

相似问题

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