Ist es theoretisch möglich jedes Programm in Assembler zu schreiben?



  • @Assemblernoob: schau dir mal an, wie ein Compiler/Linker funktioniert. Aus einer Datei xyz.c wird z.B. object-code xyz.o. In den GNU Binutils findet man objdump, dass dir den Assemblercode da drinnen zeigt. Der Compiler übersetzt eine Hochsprache in Assemblercode. Das kannst Du hier nachlesen: http://www.henkessoft.de/C/C-Programming Under The Hood.htm



  • Schön schön, aber wo kommt denn der Assembler-Code her? Hat da nicht mal jemand in der Steinzeit das C++ - Assembler - Wörterbuch geschrieben? Außerdem wird doch das C-Programm direkt in Maschinensprache umgewandelt und nicht erst in lesbares Assembler. Wo ist den der für Menschen lesbare Assembler-Code? Gibts ne Library?



  • Maschinensprache ist das, was dein Computer wirklich versteht. Assembler ist nur eine Hilfskonstruktion, die zwar recht nahe an Maschinensprache dran ist, aber für Menschen besser gelesen werden kann.
    (und es gibt Hilfsprogramme, die bei Bedarf den Maschinencode in Assembler übersetzen können)



  • Maschinencode lässt sich (nahezu?) 1:1 in Assembler übersetzen. Das heißt, dass du von jeder beliebigen Sprache über Maschinencode zu Assembler kommen kannst.



  • Das war nicht ganz die Antwort auf meine Frage. Ich kenne den Unterschied zwischen Maschinencode und Assembler, ich meinte eigentlich ob es Libraries in Assembler gibt und man z.B. int main(){return 0;} in Assembler umschreiben kann, so dass der Compiler sofort meine Änderungen compiled?



  • ps und wo sind diese Libraries?



  • sj schrieb:

    Das war nicht ganz die Antwort auf meine Frage. Ich kenne den Unterschied zwischen Maschinencode und Assembler, ich meinte eigentlich ob es Libraries in Assembler gibt und man z.B. int main(){return 0;} in Assembler umschreiben kann, so dass der Compiler sofort meine Änderungen compiled?

    Ich verstehe die Frage nicht. Dein Compiler kann C++-Code in Maschinencode oder auch direkt in Assembler übersetzen.



  • Ich meine hat nicht irgendwer die ganzen Befehle die es in C++ oder Pascal oder sonst was, irgendwann einmal in Assembler geschrieben?



  • sj schrieb:

    Ich meine hat nicht irgendwer die ganzen Befehle die es in C++ oder Pascal oder sonst was, irgendwann einmal in Assembler geschrieben?

    Was denkst du was ein Compiler macht?

    1. Annahme: Bytecode = Assembler.
    2. Annahme: Compiler bauen Bytecode.

    Was gibt es daran nicht zu verstehen? 😕

    Edit:
    Oder noch allgemeiner:

    1. Bytecode = Assembler.
    2. Prozessoren verstehen nur Bytecode.
    3. Programme laufen über Prozessoren!



  • Der wandelt z.B. int main(){return 0;} in
    00000000 <_main>:
    0: 55 push ebp
    1: 89 e5 mov ebp,esp
    3: 83 e4 f0 and esp,0xfffffff0
    6: e8 00 00 00 00 call b <_main+0xb>
    b: b8 00 00 00 00 mov eax,0x0
    10: c9 leave
    11: c3 ret
    12: 90 nop
    13: 90 nop
    um. Aber wer hat dem das denn beigebracht? Kann der Compiler zaubern? Und wo sind die Libs dafür? In welchen Dateien steht der original Assemblercode? Den will ich haben. Kann doch nicht so schwer zu verstehen sein.


  • Mod

    sj schrieb:

    Kann der Compiler zaubern?

    Um die Frage ein für allemal zu klären: Ja.

    Was dachtest du sonst, wie der allererste Computer programmiert wurde?



  • sj schrieb:

    Aber wer hat dem das denn beigebracht? Kann der Compiler zaubern? Und wo sind die Libs dafür? In welchen Dateien steht der original Assemblercode? Den will ich haben. Kann doch nicht so schwer zu verstehen sein.

    Der Compiler ist in der Lage, C++ Code zu verstehen - und im Compiler ist auch hinterlegt, was er aus den C++ Anweisungen machen soll. Sowas kann man nicht zwischen Tür und Angel erklären, dafür empfehle ich mal ein Buch zum Thema Compilerbau.

    (oder du schaust dir den Compiler auch mal in Assember an :D)



  • SeppJ schrieb:

    Ja.

    😃

    @TE
    Der erste Assembler (Compiler für Assembler) wurde in Bytecode geschrieben. Der erste Compiler einer Sprache entweder in Assembler oder in einer Sprache, für die bereits ein Compiler existierte. So baut man von unten nach oben Funktionalität aus. Verstanden?



  • sj schrieb:

    Aber wer hat dem das denn beigebracht?

    Die Programmierer des Compilers.

    Und wo sind die Libs dafür? In welchen Dateien steht der original Assemblercode?

    Der Compiler ist die "Lib".



  • Mal andersrum, wenn ich also alle Funktionen von C++ in Assembler haben möchte, muss ich alle Funktionen compilieren und diese dann von Hand speichern, so daß ich alle Funktionen als Assembler-Source-Code habe?
    Ansonsten geb ich's auf, danke.



  • Einmal noch, habt ihr schon mal ein Disassemblat gesehen ohne Debuginfos? Na toll, schein ja ein Militärgeheimnis zu sein 🙂



  • Darf man fragen, was du überhaupt vorhast?
    (praktisch gesehen: Der Compiler arbeitet nicht mit "Funktionen", sondern mit Sprach-Bestandteilen - für jedes Konstrukt, das in der Sprache vorgesehen ist, gibt es Möglichkeiten, es in Maschinencode darzustellen. Und genau das macht der Compiler, wenn du ihm einen Quellcode vorsetzt (natürlich muß er zunächst die verwendeten Sprachmittel identifizieren))


  • Mod

    Alle Standardfunktionen (das heißt "richtige" Funktionen, also alles, was zum Beispiel hier erwähnt wird) sind in der C(++) Laufzeitbibliothek. Die kannst du dir einfach angucken oder disassemblieren, davon ist (in der Regel) sogar der (in C(++) geschriebene) Quelltext verfügbar. Da stehen aber nicht so Sachen drin, wie zum Beispiel zwei Zahlen addiert werden, so ein triviales Zeugs ist im Compiler selber eingebaut.



  • Man programmiert doch nur noch z.B.
    int main () {

    ifstream infile;

    infile.open ("test.txt", ifstream::in);
    ...
    und keiner weiß, was eigentlich passiert, und keinen interessierts, funktioniert doch prima. Ich will aber gerade wissen was der Rechner, z.b. bei infile.open(... eigentlich macht, und wenn ich will, programmiere/optimiere(haha) ich einfach den Assembler-Code. Der Thread war mir einfach nicht ausreichend beantwortet.
    Ich werde ins Assembler-Forum wechseln...
    Aber Danke für die Hilfe.



  • Wie ich schon gesagt habe, wenn dich die Innereien des Compilers interessieren, solltest du dir mal etwas Literatur zum Thema Compilerbau suchen. Sowas haben kluge Leute sehr ausführlich durchdacht, damit wir als 08/15-Programmierer uns nicht mehr um die Details kümmern müssen.

    PS: bei ifstream::open() kannst du sogar das Glück haben, daß du die Funktion in Reinform in den System-Headern vorfindest - einfach mal umschauen 😉


Anmelden zum Antworten