2012-11-14 31 views
0

我来越过这样的代码段:我如何知道装配中的指令长度?

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 

我不知道如何剂量笔者知道每个指令有多少字节?

+6

无论是从经验,在英特尔文档中查找,还是从生成asm列表文件。 –

回答

1

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

因此,正如您所搜集的,您必须“知道” - 并且通过查阅英特尔手册中的说明来了解这一点。

如果你想工作的大小说mov rax, [rsp+8]你可以在NASM组装这一点,我会给你一个简单的例子:

BITS 64 
mov rax, [rsp+8] 

用下面的命令:

nasm -fbin test.asm -o test.bin 

检查test.bin,你会看到在十六进制它是:

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

相关问题