Schleife&Verzweigung, Hilfe!!!!



  • Folgendes Programm soll ich als inline assembler sprache ausdrücken:

    unsigned int func(unsigned int n)
    { while (n < 50){
    n = 3
    n + 2;
    if (n > 50){
    n = n-3; }
    }
    return n; }*

    a) Realisieren Sie die obige Funktion als ein Inline-Assembler-Programm mit Microsoft Visual Studio (oder Alternativen). Erstellen Sie dazu eine C/C++-Funktion, welche die Variable n als Funktionsparameter übergeben bekommt und die obigen Berechnungen in Assembler durchführt.

    b) Geben Sie das Resultat mit der „printf“-Funktion aus.

    c) Achten Sie darauf, dass sämtliche Register nach Programmende unverändert vorliegen.

    d) Versehen Sie Ihr Inline-Assembler-Programm mit nachvollziehbaren Kommentaren.

    Leider weiß ich nicht wie ich das realisieren soll da sich ja eine schleife und eine verzweigung im programm befindet die voneinander abhängen.

    Mir ist bewusst das die mit den jump befehlen und cmp befehl geschehen soll. Aber zwei "schleifen" bereiten mir kopf zerbrechen...

    Kann mir jemand bitte weiterhelfen?



  • Ersetzte die while-Schleife und die if-Abfrage durch goto Statements (auf Papier oder als C Programm). Wenn du das hast sollte es einfach sein das in Assembly Language umzuschreiben.



  • Na wie macht es denn VS?:

    unsigned int func(unsigned int n)
    { while (n < 50){
    00411590  push        ebp  
    00411591  mov         ebp,esp 
    00411593  sub         esp,0C0h 
    00411599  push        ebx  
    0041159A  push        esi  
    0041159B  push        edi  
    0041159C  lea         edi,[ebp-0C0h] 
    004115A2  mov         ecx,30h 
    004115A7  mov         eax,0CCCCCCCCh 
    004115AC  rep stos    dword ptr es:[edi] 
    004115AE  cmp         dword ptr [n],32h 
    004115B2  jae         func+41h (4115D1h) 
    	n = 3*n + 2;
    004115B4  mov         eax,dword ptr [n] 
    004115B7  imul        eax,eax,3 
    004115BA  add         eax,2 
    004115BD  mov         dword ptr [n],eax 
    	if (n > 50){
    004115C0  cmp         dword ptr [n],32h 
    004115C4  jbe         func+3Fh (4115CFh) 
    		n = n-3; }
    004115C6  mov         eax,dword ptr [n] 
    004115C9  sub         eax,3 
    004115CC  mov         dword ptr [n],eax 
    }
    004115CF  jmp         func+1Eh (4115AEh) 
    return n; } 
    004115D1  mov         eax,dword ptr [n] 
    004115D4  pop         edi  
    004115D5  pop         esi  
    004115D6  pop         ebx  
    004115D7  mov         esp,ebp 
    004115D9  pop         ebp  
    004115DA  ret
    

    Ist doch schon ein Anfang. 😉



  • Rodger schrieb:

    Aber zwei "schleifen" bereiten mir kopf zerbrechen...

    kein Wunder, da ist ja auch nur eine. Schlechter Sprit? -> FuselDusel Auweia!!!!!!!!!!!



  • Du hast die if-Schleife übersehen, nachtfeuer.



  • Swordfish schrieb:

    Du hast die if-Schleife übersehen, nachtfeuer.

    Auweia, die berüchtigte if-Schleife muss ich wohl übersehen haben.



  • Swordfish schrieb:

    Du hast die if-Schleife übersehen, nachtfeuer.

    if ist ein Statement und keine Schleife ... Oder seit wann wiederholt if irgendwelche Anweisungen? Wenn man schon nicht in der Lage ist das irgendwann zu lernen sollte man vllt. wenigstens mal den Kopf einschalten.


  • Global Moderator

    Grump schrieb:

    Swordfish schrieb:

    Du hast die if-Schleife übersehen, nachtfeuer.

    if ist ein Statement und keine Schleife ... Oder seit wann wiederholt if irgendwelche Anweisungen?

    Die if-Schleife ist ein Running Gag hier im Forum und auch sonst überall wo viele Programmieranfänger herum laufen. Die benutzen den Begriff nämlich sehr oft. Oft genug, dass jemand sogar dies eingerichtet hat: www.if-schleife.de



  • Hi SeppJ,

    SeppJ schrieb:

    Die if-Schleife ist ein Running Gag hier im Forum und auch sonst überall wo viele Programmieranfänger herum laufen. Die benutzen den Begriff nämlich sehr oft. Oft genug, dass jemand sogar dies eingerichtet hat: www.if-schleife.de

    Wann begreift Ihr es denn endlich? Es gibt eine If-Schleife!

    1. If-Anweisung aufschreiben
    2. Übersetzungsversuch
    3. Fehlermeeldung des Compilers ---> Zurück auf 1. und nächster Schleifendurchlauf.
    

    Also wenn das keine If-Schleife ist, was dann??? 😃 😃 😃

    Gruß Mümel



  • SeppJ schrieb:

    Grump schrieb:

    Swordfish schrieb:

    Du hast die if-Schleife übersehen, nachtfeuer.

    if ist ein Statement und keine Schleife ... Oder seit wann wiederholt if irgendwelche Anweisungen?

    Die if-Schleife ist ein Running Gag hier im Forum und auch sonst überall wo viele Programmieranfänger herum laufen. Die benutzen den Begriff nämlich sehr oft. Oft genug, dass jemand sogar dies eingerichtet hat: www.if-schleife.de

    Schade, die Seite hätte wenigstens die korrekte Terminologie demonstrieren können: Es ist ein if -Statement bzw. eine if -Anweisung. if -Abfrage hab ich persönlich noch hie gehört.



  • Arcoth schrieb:

    if -Abfrage hab ich persönlich noch hie gehört.

    ..und vermutlich auch noch nie ein Flussdiagramm jesehn..



  • nachtfeuer schrieb:

    Arcoth schrieb:

    if -Abfrage hab ich persönlich noch hie gehört.

    ..und vermutlich auch noch nie ein Flussdiagramm jesehn..

    Nicht auf Deutsch. Wobei ich auch in meinem mittlerweile zweijährigen Studium keine Flussdiagramme erleben durfte; Vielleicht sind die für Leutchen reserviert, die Schwierigkeiten mit Code haben? 😉



  • Arcoth schrieb:

    Vielleicht sind die für Leutchen reserviert, die Schwierigkeiten mit Code haben? 😉

    könnte sein, z.B. für solche Leute, die noch nicht genau wissen, was auf der Hardwareebene abläuft, wenn solche "If-Schleifchen" loslegen..



  • #include<iostream>
    
    using namespace std;
    
    extern "C" __int64 _stdcall assembly(unsigned __int32 n);
    
    int main()
    {
    	unsigned __int32 n = 0;
    	cin >> n;
    	cout << assembly(n) << endl;
    
    	system("pause");
    	return 0;
    }
    
    .code
    MySegment segment read write execute
    backup_rax dq 0
    backup_rbx dq 0
    backup_rcx dq 0
    
    assembly proc
    ; n ist in rcx
    
    mov backup_rax, rax	; mache Backup von rax
    mov backup_rbx, rbx	; mache Backup von rcx
    mov backup_rcx, rcx	; mache Backup von rbx
    
    mov rax, rcx	; kopiere rcx (n) in rax, weil rax zurückgegeben wird
    mov rbx, 3		; kopiere 3 in rbx, weil mul keine immediate-Werte erlaubt
    start_:			; label für die While-Schleife
    cmp rax, 50		; vergleiche rax (n) mit 50
    jae ende		; wenn größer oder gleich, breche schleife ab
    
    mul rbx			; sonst multippliziere n mit 3
    add rax, 2		; addiere 2 zu n
    cmp rax, 50		; vergleiche n mit 50
    jbe start_		; wenn kleiner oder gleich, wiederhole Schleife
    sub rax, 3		; sonst subtrahiere 3 von rax
    jmp start_		; wiederhole Schleife
    
    ende:			; Label nach der Schleife
    
    mov rbx, backup_rbx		; rbx wiederherstellen
    mov rcx, backup_rcx		; rcx wiederherstellen
    ret						; gebe den neuen Wert n wieder zurück
    mov rax, backup_rax		; rax wiederherstellen
    
    assembly endp
    
    MySegment ends
    end
    

    Man könnte Zeile 16 weglassen und imul rax, rax, 3 nehmen. Aber es war ja von unsigned die rede (imul beschreibt eine vorzeichenbehaftete Multiplikation)