从大会地区开始,很难找到一个体面的教程。 想找一本“Assembly for Dummies”的书。汇编:何时会测试%esi,%esi返回不等于?
我遇到以下问题,'test'命令总是使用相同的地址或注册表运行。
0x08048e14 <+21>: test %esi,%esi
0x08048e16 <+23>: jne 0x8048e4b <main+76>
由于相同的注册表或地址正在和AND何时不会返回这些是相同的?
从大会地区开始,很难找到一个体面的教程。 想找一本“Assembly for Dummies”的书。汇编:何时会测试%esi,%esi返回不等于?
我遇到以下问题,'test'命令总是使用相同的地址或注册表运行。
0x08048e14 <+21>: test %esi,%esi
0x08048e16 <+23>: jne 0x8048e4b <main+76>
由于相同的注册表或地址正在和AND何时不会返回这些是相同的?
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不为零。
单击。你听到了吗?有一点点亮了。谢谢。你的回答非常明确和有帮助。 –
至少未抛出未处理的异常!别客气。 –
它不检查“相同”,它不是'cmp'。它检查按位“和”的结果是否为零,反过来又意味着“esi”为零或不是。 – Jester
[测试点%eax%eax]的可能重复(https://stackoverflow.com/questions/13064809/the-point-of-test-eax-eax) –