Hallo, ich versuche mich gerade neben der Schule etwas mit Mips und komme eigentlich relativ gut klar, bei den grundlegenden Sachen. Nun habe ich diese Übungsaufgabe in einem Buch gefunden "Bestimmen Sie die Anzahl der Instruktionen, die von der CPU ausgeführt werden" und dazu diesen Code: li $t0 , 0 li $a0 , 5 li $s0 , 0 li $s1 , 0 for_loop : andi $t0 , $s0 , 0x01 beq $t0 , $zero , continue addi $s1 , $s1 , 1 continue : addi $s0 , $s0 , 1 blt $s0 , $a0 , for_loop Die Frage ist nun was mit "Instruktionen, die von der CPU ausgeführt werden" gemeint ist? Und wie dies gehen soll. Ist es etwas wie das Zählen von Befehlen, die man nutzt um die potenzielle Laufzeit eines Algorithmuses zu bestimmen? Grüße Lina
Es geht wohl um die Auflösung der Schleife. Willst Du im Ernst in Assembler programmieren? Was soll das Beispiel machen?
Lina.N schrieb: > Die Frage ist nun was mit "Instruktionen, die von der CPU ausgeführt > werden" gemeint ist? Und wie dies gehen soll. > Ist es etwas wie das Zählen von Befehlen, die man nutzt um die > potenzielle Laufzeit eines Algorithmuses zu bestimmen? Das Programmfragment ist vollständig gegeben und es wird irgendwann enden, d.h. unten rausfallen. Der Sinn ist egal. Gesucht ist die Anzahl der in diesem Verlauf ausgeführten Befehle.
:
Bearbeitet durch User
A. K. schrieb: > Lina.N schrieb: >> Die Frage ist nun was mit "Instruktionen, die von der CPU ausgeführt >> werden" gemeint ist? Und wie dies gehen soll. >> Ist es etwas wie das Zählen von Befehlen, die man nutzt um die >> potenzielle Laufzeit eines Algorithmuses zu bestimmen? > > Das Programmfragment ist vollständig gegeben und es wird irgendwann > enden, d.h. unten rausfallen. Der Sinn ist egal. Gesucht ist die Anzahl > der in diesem Verlauf ausgeführten Befehle. hallo A. K. Danke für die Antwort Also wäre die Lösung:21? LG Lina
bei MIPS gibts noch den branch delay slot. vielleicht magste es mal mit nem Simulator zählen. http://spimsimulator.sourceforge.net/
:
Bearbeitet durch User
Dennis H. schrieb: > bei MIPS gibts noch den branch delay slot. Dazu müsste man allerdings die in der Lehre verwendete Maschine genauer kennen. Ich würde nicht blind drauf wetten, dass eine Lehrmaschine exakt mit einer realen MIPS übereinstimmt. Gerade nicht beim Delay-Slot. Und ganz besonders nicht bei diesem Code. Es sein denn, die nächste Frage will wissen, warum dieser Code nicht funktioniert.
:
Bearbeitet durch User
RISC-V wäre ja ein Vertreter der den BDS nicht implementiert. Der PIC32 hats dann allerdings wieder.
Der letzte Befehl macht klar, dass es keinen delay slot gibt. Die Aufgabe wäre sonst nicht beantwortbar.
:
Bearbeitet durch User
Dennis H. schrieb: > bei MIPS gibts noch den branch delay slot. > > vielleicht magste es mal mit nem Simulator zählen. > > http://spimsimulator.sourceforge.net/ Hallo Dennis, ich nutze Mars, was ja dasselbe ist. Hier gibt es einen Zähler dafür, nur weiß ich leider nicht ob dieser stimmt. Er kommt insgesamt auf 32 Instruktionen, davon 5x R-Typ und 26x l-typ. René H. schrieb: > Lina.N schrieb: >> Also wäre die Lösung:21? > > Auf soviel komme ich auch. > > Grüsse, > René Gut, dann scheint es ja doch irgendwie zu stimmen.
Lina.N schrieb: > Hallo, > ich versuche mich gerade neben der Schule etwas mit Mips und komme > eigentlich relativ gut klar, bei den grundlegenden Sachen. Nun habe ich > diese Übungsaufgabe in einem Buch gefunden Cool. Dieselbe Hausaufgabe hat unser Prof uns gestellt. Aus welchem Buch hast Du die denn?
1 | Annahme: $zero == 0 |
2 | In: Anzahl Instruktionen |
3 | |
4 | Schliefendurchlauf | 1 | 2 | 3 | 4 | 5 | |
5 | ________________________________|In $s0 $t0|In $s0 $t0|In $s0 $t0|In $s0 $t0|In $s0 $t0| |
6 | | | | | | | |
7 | li $t0 , 0 | 1 - 0 | | | | | |
8 | li $a0 , 5 | 2 - 0 | | | | | |
9 | li $s0 , 0 | 3 0 0 | | | | | |
10 | li $s1 , 0 | 4 0 0 | | | | | |
11 | | | | | | | |
12 | for_loop : | | | | | | |
13 | andi $t0 , $s0 , 0x01 | 5 0 0 |10 1 1 |15 2 2 |20 3 3 |25 4 4 | |
14 | beq $t0 , $zero , continue | 6 0 1 |11 1 2 |16 2 2 |21 3 3 |26 4 4 | |
15 | addi $s1 , $s1 , 1 | 7 0 1 |12 1 2 |17 2 3 |22 3 4 |27 4 5 | |
16 | | | | | | | |
17 | continue : | | | | | | |
18 | addi $s0 , $s0 , 1 | 8 0 1 |13 1 2 |18 2 3 |23 3 4 |28 4 5 | |
19 | blt $s0 , $a0 , for_loop | 9 1 1 |14 2 2 |19 3 3 |24 4 4 |29 5 5 | |
eher 22. Die Schleifeninstruktion ist ein blt, damit ist die Schleife bei s0 = 4 vorbei, die letzten 5 Instruktionen entfallen somit. Außerdem ist die erste Instruktion nach for_loop kein addi, sondern andi, s1 wird damit nur inkrementiert, wenn s0 die Werte 1 oder 3 hat (für s0 = 0 und 2 entfallen noch mal 2 Instruktionen). 29-5-2=22
Komisch, warum kommen wir denn alle auf unterschiedliche Ergebnisse? ich komme auf 29
Beitrag #5671033 wurde vom Autor gelöscht.
Ich tät ja sagen, dass die richtige Lösung noch auf Entdeckung wartet. :-)
A. K. schrieb: > Ich tät ja sagen, dass die richtige Lösung noch auf Entdeckung > wartet. > :-) :=) Denke ich auch. Würde der Dame so gerne helfen, aber als ich das letzte mal direkt programmiert habe, stand die Mauer noch, die guten alten Zeiten.
Tipp für Zählmeister: Wenn eine CPU einen nicht ausgeführten Sprung ausführt, dann führt sie ihn aus obwohl sie ihn nicht ausführt.
:
Bearbeitet durch User
Mit dem Simulator QtSpim kommt man auf 31 Instruktionen, wenn man mit single step das Programm abarbeitet. https://sourceforge.net/projects/spimsimulator/ Version 9.1.19 Hier das Programm test.asm für den Simulator QtSpim. main: li $t0 , 0 li $a0 , 5 li $s0 , 0 li $s1 , 0 for_loop : andi $t0 , $s0 , 0x01 beq $t0 , $zero , continue addi $s1 , $s1 , 1 continue : addi $s0 , $s0 , 1 blt $s0 , $a0 , for_loop
Das andi $t0 , $s0 , 0x01 beq $t0 , $zero , continue 'if (($s0 & 1)==0) goto continue dürfte bei jedem zweiten durchlauf ein Überspringen von addi $s1 , $s1 , 1 'increment $s1 bewirken. Wenns denn 'n branch delay Slot gibt wird $s1 jedesmal hochgezählt. Unabhängig vom Sprung. Also ein umfangreiches NOP im weitestgehenden Sinne.
:
Bearbeitet durch User
Mit delay slot ist das Fragment unvollständig und die Frage nicht beantwortbar. Häng ein "li $s0,0" in den delay slot hinter dem letzten Befehl und lass den Simulator dann sein Werk vollenden.
:
Bearbeitet durch User
A. K. schrieb: > Mit delay slot ist das Fragment unvollständig und die Frage nicht > beantwortbar. Häng ein "li $s0,0" in den delay slot hinter dem letzten > Befehl und lass den Simulator dann sein Werk vollenden. Im Simulator sind 31 Befehle, ohne die Ausführung des hinzugefügten li $s0,0, zum durchlaufen des Programms notwendig. main: li $t0 , 0 li $a0 , 5 li $s0 , 0 li $s1 , 0 for_loop : andi $t0 , $s0 , 0x01 beq $t0 , $zero , continue addi $s1 , $s1 , 1 continue : addi $s0 , $s0 , 1 blt $s0 , $a0 , for_loop li $s0,0
A. K. schrieb: > Mit delay slot ist das Fragment unvollständig und die Frage nicht > beantwortbar. Häng ein "li $s0,0" in den delay slot hinter dem letzten > Befehl und lass den Simulator dann sein Werk vollenden. ich denk mir dann ja ein NOP automatisch nach dem Sprung. Aber vorher wurde ja schon klar gestellt, daß es sich nur um einen theoretischen MIPS handelt der sowas wohl nicht hat. Also so ala RISC-V. Ich bring halt gern meine Erfahrungen mit realen MIPS-CPU's ein :)
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.