2012-11-14 27 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

相關問題