Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Blatt 7 Aufgabe 7
Ich habe ein Problem mit der Teilaufgabe b). Hier der gegebene Assembler Code dazu:
1 Lstart:
2 movl $2 , %eax
3 movl $1 , %ecx
4 Lcond :
5 cmpl %eax , %ecx
6 je Lend
7 jg Lgreater
8 Lless :
9 subl %ecx , %eax
10 jmp Lcond
11 Lgreater :
12 subl %eax , %ecx
13 jmp Lcond
14 Lend :
In Zeile 5 vergleiche ich ja das Register %eax mit dem Register %ecx. Da %eax größer ist, springe ich zum Label Lgreater und ziehe von %ecx das Register %eax ab. Jetzt steht im Register %eax noch die 2, im Register %ecx -1. Dann vergleiche ich wieder und sehe, dass %eax immernoch größer ist… Das geht doch dann endlos so weiter? Ich hab zuerst gedacht, dass ich die Reihenfolge des [m]jg[/m] oder des [m]subl[/m] Befehls vielleicht misserverstanden habe, aber dem scheint nicht so zu sein.
Meine Frage also: Hab ich doch etwas falsch verstanden? Ist das ein Fehler, oder soll das so sein? Man soll ja eine Pipeline dazu füllen, und unendlich Platz, oder zumindest soviel, bis %ecx irgendwann die Grenze erreicht hat und wieder ins positive umschlägt, hab ich leider nicht.
Achtung, AT&T:
cmpl %eax, %ecx rechnet %ecx-%eax, jg wertet die Flags der Operation aus.
Der Wert in ecx ist kleiner, also wird nicht gesprungen.
Danke Ich war mir sicher, dass das anders rum ausgewertet wird.
Was hat es denn mit BA1 und BA2 auf sich?
Wird da derselbe Befehl zweimal aufgeführt? Oder wie läuft das ab?
Die Befehlsausfuehren-Phase ist einfach in zwei Phasen aufgeteilt. Macht Sinn, weil ALU in diesem Modell die langsamste Stufe ist und sich der Takt nach der langsamsten Phase richten muss.
Fuer die Aufgabe spielt das aber kaum eine Rolle.