【发布时间】:2013-06-27 02:24:13
【问题描述】:
假设以下 x86-32 指令:
add ebx,1
有(至少)两种方法来组装这个操作码:
81 c3 01 00 00 00
或
83 c3 01
第一个将 1 保留为 4 字节的 dword 第二个保持 1 作为一个字节
是否有一条指令将 1 保留为 2 个字节? 如果没有,为什么?
【问题讨论】:
-
我最喜欢的是
inc ebx,如果我要经常使用它,或者将常量加载到另一个reg中,然后add ebx,reg。 -
为什么不呢?因为它需要太多额外的操作码或前缀。早在 386 时,英特尔就意识到为未来的扩展留出空间可能很重要,并且没有填满编码空间。如果假设
add r/m32, imm16的操作码或前缀长了一个字节,它最终只会节省一个字节而不是两个。适合 16 位但不是 8 位的立即数非常罕见:大多数数字要么很小,要么是指针,因此它不足以证明成本合理。
标签: assembly x86 reverse-engineering nasm