从组装区开始,很难找到一份像样的教程。想找一本“傻瓜大会”的书。
我遇到了以下情况,“test”命令总是使用相同的地址或注册表运行。
0x08048e14 <+21>: test %esi,%esi
0x08048e16 <+23>: jne 0x8048e4b <main+76>既然是同一个登记处或地址,它什么时候不返回它们是相同的?
发布于 2017-06-21 01:05:32
test reg, reg(对于两个操作数,reg都是相同的),您几乎总是会看到它,而不是:
cmp reg, 0在优化的代码中。这两个指令都以相同的方式设置标志,但前者的编码字节较少,因此速度稍快。
因此,您的代码只是测试看看esi寄存器是否为零。如果它是非零,它接受分支;如果它是零,则执行失败而不分支。
为什么要这么做?正如您似乎已经知道的那样,TEST指令只是按位执行--并对其操作数进行操作。那么,真值表对按位表示的是什么呢?
|===============================|
| 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将关闭零标志,因为如果按位的结果是非零的话。
https://stackoverflow.com/questions/44665151
复制相似问题