Analysieren des Assembly-Codes

8
%Vor%

Dies ist ein Assemblercode, der aus diesem C-Programm generiert wird:

%Vor%

Dies ist auch der Objektcode, der aus dem obigen Programm generiert wurde:

%Vor%

Idealerweise müssen die Listen (1) und (2) identisch sein. Aber ich sehe dass es Movl, Pushl etc in Listing (1) gibt, während mov, push in lisierend (2). Meine Frage ist:

  1. Was ist die richtige Montageanweisung, die tatsächlich auf dem Prozessor ausgeführt wird?
  2. In Listing (1) sehe ich das am Anfang:

%Vor%

und das am Ende:

%Vor%

Was bedeutet das?

Danke.

    
Onkar Mahajan 26.10.2010, 04:24
quelle

2 Antworten

13

Die Anweisung heißt MOV , welche Variante auch immer verwendet wird. Das l -Suffix ist nur eine gcc / AT & amp; T-Assemblierungskonvention, um die Größe von gewünschten Operanden, in diesem Fall 4-Byte-Operanden, anzugeben.

In der Intel-Syntax - wo es Unklarheiten gibt - ist es üblich, anstelle der Anweisung den Speicherparameter mit einem Indikator der benötigten Größe zu versehen (zB BYTE , WORD , DWORD , etc.) Es ist nur eine andere Möglichkeit, dasselbe zu erreichen.

89 55 ist die korrekte Bytefolge für MOV vom 32-Bit-Register EBP zum 32-Bit-Register ESP . In beiden Listen ist nichts falsch.

Gibt die Datei an, aus der dieser Assemblycode generiert wurde:

%Vor%

Sagt, dass accum ein globales Symbol ist (C-Variable mit externer Verknüpfung):

%Vor%

Die folgenden Bytes sollten in einem bss -Abschnitt platziert werden. Dies ist ein Abschnitt, der keinen Platz in der Objektdatei einnimmt, aber zur Laufzeit zugewiesen und auf Null gesetzt wird.

%Vor%

An einer 4-Byte-Grenze ausgerichtet:

%Vor%

Es ist ein Objekt (eine Variable, kein Code):

%Vor%

Es sind vier Bytes:

%Vor%

Hier ist accum definiert, vier Nullbytes.

%Vor%

Wechseln Sie nun vom Abschnitt bss zum Textabschnitt, in dem normalerweise Funktionen gespeichert sind.

%Vor%

Fügen Sie bis zu drei Byte Padding hinzu, um sicherzustellen, dass wir uns auf einer Grenze von 4 Byte (2 ^ 2) befinden:

%Vor%

sum ist ein globales Symbol und es ist eine Funktion.

%Vor%

Die Größe von main ist "hier" - "wo main gestartet":

%Vor%

Hier werden die gcc-spezifischen Stapeloptionen angegeben. Normalerweise wählen Sie hier einen ausführbaren Stack (nicht sehr sicher) oder nicht (normalerweise bevorzugt).

%Vor%

Identifizieren Sie, welche Version des Compilers diese Assembly generiert hat:

%Vor%     
Charles Bailey 26.10.2010, 04:40
quelle
0

Die Assemblerliste und die Disassemblerliste zeigen den gleichen Code, verwenden aber eine andere Syntax. Der angehängte -l ist die Syntaxvariante, die von gcc verwendet wird. Dass Sie eine andere Syntax in den Tools (C-Compiler-Ausgabe und Disassembler) haben, zeigt eine Schwäche Ihrer Toolchain.

Die disassembly bei Offset 11 in Summe: zeigt nur einige Müll-Bytes. Der Einstiegspunkt zur nächsten Hauptfunktion ist 4-Byte-ausgerichtet, was diese Lücke füllt, mit Müll füllen.

Die Menge der .statements ist in der Dokumentation des Assemblers definiert. Normalerweise geben sie keinen ausführbaren Code.

    
harper 26.10.2010 04:50
quelle

Tags und Links