我如何知道装配中的指令长度?

时间:2012-11-14 09:34:51

标签: assembly architecture x86

我遇到了这样一段代码:

jmp 0x26 #2 bytes
popl %esi #1 bytes
movl %esi,0x8(%esi) # 3 bytes
movb $0x0,0x7(%esi) # 4 bytes

.....

.string \"/bin/sh\" #8 bytes

我想知道作者知道每条指令的字节数是多少?

1 个答案:

答案 0 :(得分:1)

我喜欢你得到的第一个评论基本上就是答案......但它不在答案框中!所以我会对此进行扩展。

所以,正如你所聚集的那样,你必须“知道” - 你通过查阅英特尔手册中的说明了解这一点。

我会给你一个直截了当的例子如果你想计算出mov rax, [rsp+8]的大小你可以用nasm组装它:

 BITS 64
 mov rax, [rsp+8]

使用以下命令:

 nasm -fbin test.asm -o test.bin

检查test.bin,你会在Hex中看到它是:

 48 8B 44 24 08

此处8B代表mov指令。它前面的48是一个REX前缀,其w属性集(表示64位目标)。最后一个字节08表示前一个寄存器的位移,即24,表示esp(目标范围很宽,因为REX前缀告诉我们所以)。最后,44代表eax*2,这将是一个64位宽的字段。

这里使用的确切寻址模式非常复杂,但可以说很快就可以解决常见的寻址模式。例如,32位等效(mov eax, [esp+4])是4字节8B 44 24 04