C to asm ohne Compiler-ohne Compiler Overhead? :-)
-
Wie gesagt, ich weiss leider nicht ob das Overhead heisst, was ich aber meine ist neben dem Code, die zusätzlichen Befehle/Anweisungen die in der Exe sind.
Gibts was wo ich nur den Code sehen kann bzw wie/wo steht dann der Code?
mfg
-
Jeder Compiler bietet dir die Möglichkeit dir den Assemblercode für deinen Quellcode auszugeben, meist sogar mit Kommentaren wo drin steht welche C-Zeile hier steht.
-
Können Sie Alle schrieb:
Jeder Compiler bietet dir die Möglichkeit dir den Assemblercode für deinen Quellcode auszugeben, meist sogar mit Kommentaren wo drin steht welche C-Zeile hier steht.
So gut wie jeder...
Probier mal MSVC.
-
HelferDude schrieb:
Können Sie Alle schrieb:
Jeder Compiler bietet dir die Möglichkeit dir den Assemblercode für deinen Quellcode auszugeben, meist sogar mit Kommentaren wo drin steht welche C-Zeile hier steht.
So gut wie jeder...
Probier mal MSVC.Das ist der einzige mit dem ich es bisher selbst gemacht hab...
-
habe ähnliche problematik, ich nutze DevC und finde keine asm option
-
@muhi und @ccc:
Wenn ihr keine Ahnung über Funktionsweise und Grundlagen von Compilern habt (was nicht unbedingt erforderlich ist, um programmieren zu können, aber sicherlich auch nicht schaden kann), dann akzeptiert doch, dass wenn ihr eurer c-file kompiliert eine ausfürhbare Datei hinten rausfällt und fangt an die algorithmen und datenstrukturen zu optimieren, wenn euer programm zu langsam ist.
Die optimierung moderner compiler ist mit handgeschriebenen assembler code kaum zu überbieten, zumal assembler code sehr viel anfälliger für bugs ist und sehr viel schwieriger in der wartung.Zum eigendlichen Thema:
Ein compiler erzeugt maschinencode! bei den meisten Compilern ist ein assembler integriert.
Den assemblercode, den compiler mit entsprechendem commandozeilenflag auch in ein file schreiben wird an den internen assembler übergeben, der disesn 1:1 in Maschinencode übersetzt.Demzufolge ist es egal, ob du dein c-compiler asm-code erstellen lässt und diesen mit einem seperaten assembler in maschinencode übersetzt.
Das ergebnis ist IDENTISCH, da Maschinensprache das gleiche wie assembler ist, der 1:1 in mashinencode und wieder zurück umgewandelt werden kann.
Assembler ist nur eine andere Darstellungsform. Is vielleicht bedingt vergleichbar mit 0xA, was das selbe ist wie 10Wenn ihr das bisschen overhead loswerden willst, was jeder compiler erzeugt, dann bringt es also nix, ein c programm zu schreiben, von diesem ein asm-listing zu erstelen und dieses dann zu assemblieren.
Ihr müsstet dann komplett in assembler programmieren (oder _laufzeitkritische_ (80:20 Regel) teile in inline assembler).
-
vlad_tepesch schrieb:
Zum eigendlichen Thema:
Ein compiler erzeugt maschinencode! bei den meisten Compilern ist ein assembler integriert.
Den assemblercode, den compiler mit entsprechendem commandozeilenflag auch in ein file schreiben wird an den internen assembler übergeben, der disesn 1:1 in Maschinencode übersetzt.Hin ja, zurück ist es nicht ganz so einfach.
-
Nicht ganz schrieb:
Hin ja, zurück ist es nicht ganz so einfach.
Is es doch, du nimmst einen disassembler und kannst jedes programm als asm listing anschauen, dass da natürlich nicht 100% der asm quelltext rauskommt ist klar, die bezeichner gehen zB verloren, da die ja in adressen umgesetzt werde.
-
vlad_tepesch schrieb:
Nicht ganz schrieb:
Hin ja, zurück ist es nicht ganz so einfach.
Is es doch, du nimmst einen disassembler und kannst jedes programm als asm listing anschauen, dass da natürlich nicht 100% der asm quelltext rauskommt ist klar, die bezeichner gehen zB verloren, da die ja in adressen umgesetzt werde.
In der Theorie ja, in der Praxis nein, da der Disassembler nicht so leicht entscheiden kann was Daten und was Maschinencode ist.
Schau dir mal "Assembler-Makros" an, die nutzen genau diese Schwäche aus und deshalb arbeiten moderne leistungsfähige Disassembler mit probabilistischen Methoden und analysieren den Programmfluss zur Laufzeit um zusätzliche Informationen zu gewinnen, und versuchen durch mehrfaches Disassemblieren so möglichst sicher den "richtigen" Code wiederherszustellen.
-
Nicht ganz schrieb:
vlad_tepesch schrieb:
Nicht ganz schrieb:
Hin ja, zurück ist es nicht ganz so einfach.
Is es doch, du nimmst einen disassembler und kannst jedes programm als asm listing anschauen, dass da natürlich nicht 100% der asm quelltext rauskommt ist klar, die bezeichner gehen zB verloren, da die ja in adressen umgesetzt werde.
In der Theorie ja, in der Praxis nein, da der Disassembler nicht so leicht entscheiden kann was Daten und was Maschinencode ist.
Schau dir mal "Assembler-Makros" an, die nutzen genau diese Schwäche aus und deshalb arbeiten moderne leistungsfähige Disassembler mit probabilistischen Methoden und analysieren den Programmfluss zur Laufzeit um zusätzliche Informationen zu gewinnen, und versuchen durch mehrfaches Disassemblieren so möglichst sicher den "richtigen" Code wiederherszustellen.Kleine Korrektur: was Code ist und was kein Code ist