Schleifen in Assembler ( wichtig)



  • Hi Leute,
    ich bin neu hier übermorgen schreibe ich eine Klausur und hätte eine Frage zu Assembler.
    Wie erstellt man in Assembler Schleifen ?? Suchfunktion habe ich genutzt aber das hat mir nicht geholfen. Könnte irgendjemand vielleicht zeigen wie das geht ??
    Ich hätte hier folgendes Beispiel:

    #include <iostream>
    using namespace std;

    main(){
    int zaehler;
    float summe, m, zahl;

    zaehler= 0;
    summe = 0;
    zahl= 1;

    while (zahl!=0) { cin << zahl;
    summe = summe+1;
    zaehler=zahehler+1;}

    if (zaehler==1) {cout << "Sie haben abgebrochen!";}
    else {zaehler=zaehler-1;
    m= summe/zaehler;
    cout << m;};

    system ("PAUSE");
    };

    Es wäre sehr sehr nett wenn mir das jemand in Assembler übersetzen kann oder zumindest nur wie das mit Schleifen funktioniert.

    danke im voraus 🙂



  • mein Assembler ist extrem eingerostet, aber:

    es gibt keine schleifen in Assembler, du benutzt Jumps. Sprich:

    aus

    while (zahl != 0)
    {
        bla bla
    }
    blubb blubb
    

    wird ein:

    CMP zahl, 0
    JNE ende
    blabla
    ende: blubb blubb
    

    (wie das genau ausschaut haengt natuerlich davon ab, fuer welchen Assembler und fuer welche Architektur du das haben musst).

    EDIT: wenn du's genau haben musst kannst ja auch deinen C++ Compiler bitten, das in Assembler zu uebersetzen 😉



  • kommt evtl. ein bischen auf die cpu an, aber x86 hat ein "loop" dafür mußt du aber vorher wissen, wie oft die schleife durchlaufen werden soll, und diese anzahl packst du in "ecx"

    For Loop with A-Priori Loop Count
    http://web.cecs.pdx.edu/~herb/cs200w03/loops.htm



  • Da du nicht geschrieben hast, mit welcher Plattform ihr lernt, nehme ich x86 (PC) an. Weiter gehe ich davon aus, dass du zumindest eine ganz grobe Vorstellung davon hast, wie Assembler (auf dem x86) funktioniert. Sollte das nicht der Fall sein, schlage ich vor, du investierst deine verbleibende Zeit lieber in etwas Nuetzliches (zB. andere Klausurbereiche oder eine Krankschreibung :D).

    Vielleicht kannst hilft dir auch noch ein Anfaengertutorial. Siehe FAQ und hier.

    Ansonsten wie Blue-Tiger andeutete ist das prinzipielle Muster einer Schleife allgemein:

    //vorpruefend:
    Label1:
    if check (abbruchbedingung) then jump Ende1
    tuirgendwas
    jump Label1
    Ende1:
    
    //nachpruefend:
    Label2:
    tuirgendwas
    if not check (abbruchbedingung) then jump Label2
    

    In x86 zB. mit einem Zaehler:

    ;vorpruefend: while (cx < 5) do {...; cx++;}
    Label1:
    cmp cx, 5 ; vergleiche cx mit 5
    jnb Ende1 ; Springe wenn nicht kleiner
    ; ...
    inc cx    ; cx++
    jmp Label1
    Ende1:
    
    ;nachpruefend: do {...; cx++;} while (cx < 5);
    Label2:
    ;...
    inc cx     ; so
    cmp cx, 5  ; so
    jb Label2  ; Springe wenn kleiner
    

    Ansonsten hilft evtl. auch Wikipedia zum Thema Schleifen



  • erstmal danke für eure Hilfe. Das wird mir schon helfen
    @ Blue-Tiger: Wie funktioniert das, dass mein Compiler alles direkt in der Assemblersprache übersetzt.

    danke im voraus 🙂



  • 3478051 schrieb:

    erstmal danke für eure Hilfe. Das wird mir schon helfen
    @ Blue-Tiger: Wie funktioniert das, dass mein Compiler alles direkt in der Assemblersprache übersetzt.

    danke im voraus 🙂

    lies die anleitung deines compilers, evtl. bietet der sowas an, oder beschäftige dich mit deiner entwicklungsumgebung, denn die meißten können das direkt beim debuggen anzeigen, oder schau dir mal programme wie "ollydbg" oder "ida pro" an, beide kostenlos verfügbar...

    schönes we 😃


Anmelden zum Antworten