Forum: PC-Programmierung Verständnisfrage bei einer Mips Übungsaufgabe


von Lina.N (Gast)


Lesenswert?

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

von Pete K. (pete77)


Lesenswert?

Es geht wohl um die Auflösung der Schleife.
Willst Du im Ernst in Assembler programmieren? Was soll das Beispiel 
machen?

von (prx) A. K. (prx)


Lesenswert?

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
von Lina.N (Gast)


Lesenswert?

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

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

bei MIPS gibts noch den branch delay slot.

vielleicht magste es mal mit nem Simulator zählen.

http://spimsimulator.sourceforge.net/

: Bearbeitet durch User
von René H. (Gast)


Lesenswert?

Lina.N schrieb:
> Also wäre die Lösung:21?

Auf soviel komme ich auch.

Grüsse,
René

von (prx) A. K. (prx)


Lesenswert?

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
von Dennis H. (c-logic) Benutzerseite


Lesenswert?

RISC-V wäre ja ein Vertreter der den BDS nicht implementiert.
Der PIC32 hats dann allerdings wieder.

von (prx) A. K. (prx)


Lesenswert?

Der letzte Befehl macht klar, dass es keinen delay slot gibt. Die 
Aufgabe wäre sonst nicht beantwortbar.

: Bearbeitet durch User
von Lina.N (Gast)


Lesenswert?

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.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

ich komm auf 31 :)

von Lina.N (Gast)


Lesenswert?

Dennis H. schrieb:
> ich komm auf 31 :)

:)

Hat noch wer eine Zahl zu bieten xD

von (prx) A. K. (prx)


Lesenswert?

Lina.N schrieb:
> Hat noch wer eine Zahl zu bieten xD

42 geht immer.

von Claudia k. (Gast)


Lesenswert?

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?

von tut nichts zur sache (Gast)


Lesenswert?

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 |

von noch 'ne Variante (Gast)


Lesenswert?

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

von Sveb (Gast)


Lesenswert?

Komisch, warum kommen wir denn alle auf unterschiedliche Ergebnisse? ich 
komme auf 29

Beitrag #5671033 wurde vom Autor gelöscht.
von (prx) A. K. (prx)


Lesenswert?

Ich tät ja sagen, dass die richtige Lösung noch auf Entdeckung wartet. 
:-)

von Sveb (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
von Helmut S. (helmuts)


Lesenswert?

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

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

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
von (prx) A. K. (prx)


Lesenswert?

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
von Helmut S. (helmuts)


Lesenswert?

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

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.