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:
%Vor%
und das am Ende:
%Vor%Was bedeutet das?
Danke.
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):
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.
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.
Wechseln Sie nun vom Abschnitt bss
zum Textabschnitt, in dem normalerweise Funktionen gespeichert sind.
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.
Die Größe von main
ist "hier" - "wo main
gestartet":
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%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.