2017-06-21 42 views
0

从大会地区开始,很难找到一个体面的教程。 想找一本“Assembly for Dummies”的书。汇编:何时会测试%esi,%esi返回不等于?

我遇到以下问题,'test'命令总是使用相同的地址或注册表运行。

0x08048e14 <+21>: test %esi,%esi 
0x08048e16 <+23>: jne 0x8048e4b <main+76> 

由于相同的注册表或地址正在和AND何时不会返回这些是相同的?

+2

它不检查“相同”,它不是'cmp'。它检查按位“和”的结果是否为零,反过来又意味着“esi”为零或不是。 – Jester

+1

[测试点%eax%eax]的可能重复(https://stackoverflow.com/questions/13064809/the-point-of-test-eax-eax) –

回答

6
test reg, reg 

(其中reg是两个操作数是相同的)是什么,你会总是看到的,而不是:

cmp reg, 0 

在优化代码。两条指令都以相同的方式设置标志,但前者需要更少的字节进行编码,因此速度稍快。

因此,您的代码只是测试以查看esi寄存器是否为零。如果它不是零,则需要分支;如果它为零,则执行不经过分支。


为什么这样吗?那么,正如你似乎已经知道的那样,TEST指令只是对它的操作数进行按位AND操作。那么真值表对于按位与和?

|===============================| 
| Bit 1 | Bit 2 || AND | 
|---------|---------||----------| 
| 0 | 0 || 0  | 
| 1 | 0 || 0  | 
| 0 | 1 || 0  | 
| 1 | 1 || 1  | 
|===============================| 

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

+0

单击。你听到了吗?有一点点亮了。谢谢。你的回答非常明确和有帮助。 –

+0

至少未抛出未处理的异常!别客气。 –