Nei software comuni non è sicuramente una necessità, lo ammetto. Ma ci sono casi nei quali può servire conoscere la lunghezza di un'istruzione in codice macchina, diciamo di x86/x64.
Qualcuno ogni tanto necessita proprio di questo, come Get size of assembly instructions o Get size of x86-64 instruction.
MCA (Machine Code Analyzer) consente di stabilire la lunghezza delle istruzioni per x86 e x64. Oltre a questa, porta con sè tutta una serie di altre informazioni che riguardano l'istruzione.
Riporto un esempio preso dal readme.
MCA lo decodifica in questo modo:
dove ogni "riga" è un'istruzione (come si vede dal codice asm sopra).
Ogni istruzione è rappresentata da una struttura che al suo interno, oltre ai vari campi che compongono l'istruzione, ha un array di bytes chiamato
Qui riporto invece due delle istruzioni viste sopra, con il dettaglio dei campi che compongono l'istruzione:
Attualmente si trova in versione beta. L'ho provato su qualche codice e si è comportato bene, ma vista la complessità, qualche errore nella decodifica me lo aspetto. Sono presenti anche i test nella cartella /test (mi hanno permesso di trovare qualche problema).
Qualcuno ogni tanto necessita proprio di questo, come Get size of assembly instructions o Get size of x86-64 instruction.
MCA (Machine Code Analyzer) consente di stabilire la lunghezza delle istruzioni per x86 e x64. Oltre a questa, porta con sè tutta una serie di altre informazioni che riguardano l'istruzione.
Riporto un esempio preso dal readme.
Codice:
008910BC |. C785 68FFFFFF 00000000 MOV DWORD PTR SS:[LOCAL.38],0
008910C6 |. 8D45 CC LEA EAX,[LOCAL.13]
008910C9 |. 8D5D 9C LEA EBX,[LOCAL.25]
008910CC |. 33C9 XOR ECX,ECX
008910CE |> 83F9 30 /CMP ECX,30
008910D1 |. 7D 18 |JGE SHORT 008910EB
008910D3 |. 0F100408 |MOVUPS XMM0,DQWORD PTR DS:[ECX+EAX]
008910D7 |. 0F100C0B |MOVUPS XMM1,DQWORD PTR DS:[ECX+EBX]
008910DB |. 0F58C1 |ADDPS XMM0,XMM1
008910DE |. 0F11840D 6CFFFFFF |MOVUPS DQWORD PTR SS:[ECX+EBP-94],XMM0
008910E6 |. 83C1 04 |ADD ECX,4
008910E9 |.^ EB E3 \JMP SHORT 008910CE
MCA lo decodifica in questo modo:
Codice:
C7 85 68 FF FF FF 00 00 00 00
8D 45 CC
8D 5D 9C
33 C9
83 F9 30
7D 18
0F 10 04 08
0F 10 0C 0B
0F 58 C1
0F 11 84 0D 6C FF FF FF
83 C1 04
dove ogni "riga" è un'istruzione (come si vede dal codice asm sopra).
Ogni istruzione è rappresentata da una struttura che al suo interno, oltre ai vari campi che compongono l'istruzione, ha un array di bytes chiamato
instr
. L'output che si vede qui sopra è la stampa a video di questo array.Qui riporto invece due delle istruzioni viste sopra, con il dettaglio dei campi che compongono l'istruzione:
Codice:
/**
* Ref only - Instruction Line 1:
* MOV DWORD PTR SS:[LOCAL.38],0
*/
RAW bytes (hex): C7 85 68 FF FF FF 00 00 00 00
Instr. length: 10
Print instruction fields:
Located Prefixes 0:
OP: 0xC7
mod_reg_rm: 0x85
disp (4): 0xFFFFFF68
Iimm: 0x0
/**
* Ref only - Instruction Line 10:
* MOVUPS DQWORD PTR SS:[ECX+EBP-94],XMM0
*/
RAW bytes (hex): 0F 11 84 0D 6C FF FF FF
Instr. length: 8
Print instruction fields:
Located Prefixes 1:
0xF
OP: 0x11
mod_reg_rm: 0x84
SIB byte: 0xD
disp (4): 0xFFFFFF6C
Attualmente si trova in versione beta. L'ho provato su qualche codice e si è comportato bene, ma vista la complessità, qualche errore nella decodifica me lo aspetto. Sono presenti anche i test nella cartella /test (mi hanno permesso di trovare qualche problema).