Schleife&Verzweigung, Hilfe!!!!
-
Folgendes Programm soll ich als inline assembler sprache ausdrücken:
unsigned int func(unsigned int n)
{ while (n < 50){
n = 3n + 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.
-
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. eineif
-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)