我正在使用Miasm框架對 x64 匯編指令進行一些實驗。考慮下面的代碼片段,我在其中反匯編并重新組裝 的位元組碼LEA RAX, [RIP 1]:
from miasm.analysis.machine import Machine
machine = Machine("x86_64").mn
ins = machine.dis(b"\x48\x8d\x05\x01\x00\x00\x00", 64)
print(ins)
>>> LEA RAX, QWORD PTR [RIP 0x1]
machine.asm(ins)
>>> [b'J\x8d\x05\x01\x00\x00\x00', b'K\x8d\x05\x01\x00\x00\x00', b'H\x8d\x05\x01\x00\x00\x00', b'I\x8d\x05\x01\x00\x00\x00', b'fH\x8d\x05\x01\x00\x00\x00', b'fI\x8d\x05\x01\x00\x00\x00', b'fK\x8d\x05\x01\x00\x00\x00', b'fJ\x8d\x05\x01\x00\x00\x00']
for i in machine.asm(ins):
print(machine.dis(i, 64))
>>> LEA RAX, QWORD PTR [RIP 0x1]
>>> LEA RAX, QWORD PTR [RIP 0x1]
(...)
>>> LEA RAX, QWORD PTR [RIP 0x1]
我的問題是:為什么有這么多位元組碼對應于同一條指令,它們有何不同?如果我使用一個或另一個,有什么區別嗎?我的目標是撰寫一個 Python 腳本來自動生成一個相當復雜的程式集源檔案,所以我想仔細檢查一下我不會有問題,因為我“選擇”了錯誤的。
uj5u.com熱心網友回復:
有關指令編碼的詳細資訊,請參閱英特爾軟體開發手冊。
您可以在此處觀察到,該指令以 REX 前綴開頭,表示資料寬度為 64 位。此 REX 前綴編碼 4 位(R、E、X 和 W 位),但只有 R 位(必須明確選擇RAX而不是R8)和 W 位(必須設定為選擇 64 位操作而不是32 位操作)是相關的。另外兩位配置基址和索引暫存器,但您的記憶體運算元沒有它們。
因此,無論您將這些位設定為什么,結果都將是相同的。這就是顯示四種可能的編碼的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/498477.html
上一篇:機器碼可以轉成jvm位元組碼嗎?
