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
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.
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
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.
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?
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
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.
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.
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.
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 :)