Wie viele byes ist jede Anweisung kompiliert, um in x86 Assembler?
0x004012d0 <main+0>: push %ebp
0x004012d1 <main+1>: mov %esp,%ebp
0x004012d3 <main+3>: sub $0x28,%esp
Wenn die Adresse nicht verfügbar, können wir berechnen, es selbst?
Ich meine, wir haben nur die:
push %ebp
mov %esp,%ebp
sub $0x28,%esp
- Sie wollen, dass es an der Laufzeit? ie
asm_size("mov esp,ebp")
? - Diese Art von Sachen ist hardware-Architektur abhängig. Es ist nicht eine "Analyse" - problem, sondern ein "look-up geeignet 'Wörterbuch'" - problem.
- In Linux können Sie
objdump -d executable-file
zu sehen, die opcodes sind, dann werden Sie sehen, die Größe jeder Anweisung - reverseengineering.stackexchange.com/questions/5/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anzahl von bytes ist die Differenz der Adressen zwischen benachbarten Anleitung:
wenn Sie nur text, dann gehen Sie hier: http://www.swansontec.com/sintel.html und hier: http://faydoc.tripod.com/cpu/conventions.htm und berechnen Sie für jede Anweisung, Präfix und Operanden
Kann man nicht unbedingt bestimmen, die Instruktion der Größe von den Merksatz. Hier sind einige spezielle Fälle:
wenn Sie in einer 16-bit-segment,
mov eax, 0
erfordert eine0x66
Präfix, während in einer 32-bit-segment nicht. Sie müssen wissen, die Größe des Segments.in 32-bit-oder 16-bit-Modus können Sie Kodieren
add eax, 1
entweder als0x40
(inc eax
) oder0x83 0xc0 0x01
(add eax, 1
). Das heißt, es gibt einige eselsbrücken, die codiert werden kann, die in mehr als einer Hinsicht.Den Speicher operand
[eax]
kann codiereneax
entweder als Basis-oder index. Wenn es der index, müssen Sie eine zusätzliche SIB-byte nach dem MOD/RM.in der 64-bit-Modus Sie können den REX-Präfix
0x4x
Kodierung der Registerr8
-r15
. Allerdings können Sie mit0x40
als eine Art null-REX byte, die ein weiteres byte auf Ihre Anweisung.segment überschreibt können verwendet werden, auch wenn auf eine explizite segment ist die gleiche wie die implizite eins.
Gibt es viele andere Möglichkeiten zu Kodieren eine Anweisung mit mehr oder weniger bytes. Ein guter assembler sollte wohl immer die kürzesten, aber es ist sicherlich nicht notwendig, die von der Architektur. Die gute Sache ist, dass, wenn Sie studieren Band 2 der Intel IA-32 Software Developer ' s Manual, sollten Sie in der Lage sein, um es durch sich selbst.
xchg ax, ax
undnop
), und dass es zwei binäre Maschinenbefehle für eine Montage mnemonic (inc eax
im 32bit - beide0x40
und0xff 0xc0
). Sie sind sogar manchmal absichtlich mehrdeutig für einen Grund, wieNOP
Anweisungen finden Sie unter stackoverflow.com/questions/2123000/...Die erste Anweisung ist auf [Haupt - +0] und die zweite ist auf [Haupt - +1], so der erste Befehl ist 1 byte. Die Dritte Anweisung ist auf [Haupt - +3], so wird die zweite Anweisung ist zwei bytes. Man kann nicht sagen, von der Auflistung, wie lange die Dritte Anweisung ist, da es nicht in die Adresse des 4. Unterricht.
In Fall müssen Sie die assembly-code in text, müssen Sie eine assembler-routine zu bekommen
binäre Darstellung, und damit die Größe des instruction(s). Das ist natürlich abhängig von der hardware.
Zum Beispiel, hier ist ein 80x86 32-bit-Assembler öffnen source code (OllyDbg v1.10).
Wenn möglich die assembler-Listung generiert haben. Dies wird zeigen Sie Ihre source-code und als Nächstes werden die binäre Darstellung der Instruktionen und alles, was Sie tun müssen, ist zu zählen, wie viele bytes es sind, und dann hast du die Größe.