FB18 - Das Forum für Informatik

fb18.de / Bachelorstudieng / PM Technische Informatik

RS Übungsblatt 11

Rs Übungsblatt 11 2009-01-14 13:24
Anonymer User
Gleich mal ne Frgae zu Aufgabe 39

Aufgabe 39:
Schreiben Sie ein Unterprogramm mit der Signatur
void ausbit (int x),
das die ganze Zahl x als Bitkette der Länge 32 ausgibt.


Soll die Zahl also nun als lauter 0 und 1 ausgegeben werden?

RE: Rs Übungsblatt 11 2009-01-14 13:42
Rolf
So verstehe ich das.
Man gibt eine dezimale Zahl ein und die soll dann binaer ausgegeben werden.

RE: Rs Übungsblatt 11 2009-01-14 14:01
Fred
Man gibt eine dezimale Zahl ein
Wie kommst Du auf dezimal?

RE: Rs Übungsblatt 11 2009-01-14 16:55
Rolf
Okay, war bloed ausgedrueckt.
Bisher haben wir ja Zahlen immer in dezimaler oder hexadezimaler Form eingelesen, weswegen ich das einfach geschrieben habe.

Ich haette da auch gleich die Frage, gibt es einen Prefix, mit der man eine binaere Zahl einlesen kann? (wir haben ja bisher 0r fuer dezimal und 0x fuer hexadezimal verwendet)

RE: Rs Übungsblatt 11 2009-01-14 17:58
Fred
Die Literale können m.W. nur dezimal, oktal und hexadezimal angegeben werden.

RE: Rs Übungsblatt 11 2009-01-15 00:13
Rolf
Ich hab bei Aufgabe 40 das Problem, dass wenn ich die Berechnungen durchfuehre, mir das Programm die erste Ausgabe (korrekt) liefert, aber die drauffolgenden alle mit 0, NaN, oder -Inf (hab verschiedenes ausprobiert und das waren Sachen, die irgendwann mal vorkamen) ausgibt.

Auch, wenn ich den Punkt der ersten Ausgabe veraendere, genau die liefert er mir immer. Weiterzaehlen tut er auch, denn die anderen Ausgabetexte erscheinen ja auch, nur ist der eingefuegte Wert 0/NaN.
Ich gehe jetzt stark davon aus, dass der Fehler innerhalb einer bestimmten Stelle liegen sollte… aber finde ihn nicht.

Faellt dir hier vielleicht spontan was auf?
print:
mov   %g2, %o1         ! %g2 ist ein Zaehler
std    %f10, [%l1]       ! in %f10 wird der aktuell berechnete x-Wert uebergeben
ld      [%l1], %o2
ld      [%l1+4], %o3
set    fmt, %o0           ! fmt: .asciz "Ergebnis von X(%d) = %g\n"
call    printf
nop
cmp   %g2, 3000
bne    loop
nop

Ich gehe stark davon aus, dass der Rest okay sein muesste, da ja die Schleife durchgelaufen wird und verschiedene Werte richtig berechnet werden - jedoch nur der erste Wert. Und der erste Wert wird in gezeigtem Ausschnitt ausgegeben, weshalb ich denke, dass dort etwas geschieht, das die folgende Berechnung beeintraechtigt.

EDIT: Ich hab das Programm jetzt einfach anders geloest. Ein Unterprogramm zur Berechnung und dann wird das Unterprogramm einfach in einer Schleife 6 Mal aufgerufen.
Klappt auch, glaube ich…

(obwohl ich die andere Variante schoener faende… aber egal)
Sind diese Ergebnisse richtig?
x(500) = 1,31222
x(1000-3000) = 1
EDIT2: Ergebnisse sind nicht richtig. Werd jetzt aber nicht mehr drueber nachdenken. Morgen dann wieder. [26]

RE: Rs Übungsblatt 11 2009-01-15 00:33
Fred
Dir ist klar, dass ein Unterprogramm potentiell alle %o, %g und %f Register zerstört?

RE: Rs Übungsblatt 11 2009-01-15 07:20
marius
hat jemand vielleicht ein ergebnis parat, welches meines bestätigt?

rzdspc10$ a.out Ergebnis fuer x500: 0.172422 Ergebnis fuer x1000: 0.009641 Ergebnis fuer x1500: 0.004491 Ergebnis fuer x2000: 1.245216 Ergebnis fuer x2500: 0.521069 Ergebnis fuer x3000: 0.607547

RE: Rs Übungsblatt 11 2009-01-15 09:20
Stefan1971HH
Dir ist klar, dass ein Unterprogramm potentiell alle %o, %g und %f Register zerstört?

Geht es um die save/restore Befehle?

RE: Rs Übungsblatt 11 2009-01-15 11:31
Fred
Höchstens in dem Sinne, dass save/restore da auch nichts nützt.

RS Übungsblatt 11 2009-01-15 11:59
Benjamin
Hallo, ich hab da mal ein Verständnisproblem bei Aufgabe 41:

Was meint Lehmann mit "in den Speicherstellen stehen die Werte 110, 120, 130, usw."?
Heisst das, die erste Speicherstelle, auf die wir in den Aufgaben treffen enthält die 110, die zweite enthält die 120 usw?

Vielen Dank im Voraus!

Benjamin

RE: RS Übungsblatt 11 2009-01-15 16:15
Fred
Bei Aufgabe 40 habe ich folgende Zahlen raus:
x0500: 1.288736212247168 x1000: 1.332729416258972 x1500: 1.144864668538295 x2000: 1.054862891444075 x2500: 1.292802584458599 x3000: 1.049782190809054 x0500: 0.007057813075739 x1000: 0.916560711983132 x1500: 0.448100075991506 x2000: 0.896126931497168 x2500: 0.060634335479536 x3000: 0.021960687836461 Kann die jemand bestätigen?

RE: RS Übungsblatt 11 2009-01-15 17:34
marius
ich hab das ganze mal in java gemacht und bekomme da das hier raus:

x500: 0.17242177471713926 x1000: 0.0024145741499461693 x1500: 0.6473133463512779 x2000: 0.8812444065390359 x2500: 0.15719477068589693 x3000: 0.8930008188166454
was mir für den ersten wert natürlich ziemlich gut gefällt

ps: ist die erste rekursive definition

RE: RS Übungsblatt 11 2009-01-15 17:46
Wulf
Kann die jemand bestätigen?

Hab's in c implementiert und bekomm dieselben Ergebnisse raus.

RE: RS Übungsblatt 11 2009-01-15 19:11
Anonymer User
Möchte mal jemand einen Tipp für die A39 geben?

RE: RS Übungsblatt 11 2009-01-15 23:43
Fred
Möchte mal jemand einen Tipp für die A39 geben?
Zähle n von 31 bis 0 runter. Isoliere in jedem Schritt das n-te Bit und gib es aus.

RE: RS Übungsblatt 11 2009-01-16 10:07
Anonymer User
Uff, danke Fred ^^. Jetzt muss man auf sowas simples nur noch von alleine draufkommen.

RE: RS Übungsblatt 11 2009-01-16 10:27
squifi
Eigentlich ist die Aufgabe völlig irr.
Denk nicht allzu kompliziert darüber nach, dann kommt schnell eine Lösung.
Die Zahl(oder Ziffer) ist ja eigentlich schon dual in einem Register gespeichert, muss nur als solche auch ausgegeben werden.

Wobei eine Frage hätte ich noch zu der Aufgabe:
Hat jemand die Zahl als ganzes ausgeben können, oder nur Stelle für Stelle?

RE: RS Übungsblatt 11 2009-01-16 11:03
Fred
Jetzt muss man auf sowas simples nur noch von alleine draufkommen.
Naja, wie isoliert man das n-te Bit? Man schiebt das Register um n nach rechts und verundet mit dem Wert 1. Schon hat man das n-te Bit als 0 oder 1.

Um eine 0 oder eine 1 auf der Konsole sichtbar zu machen, muss man das ASCII-Zeichen 48 oder 49 ausgeben. Das dürfte auch nicht so schwer sein.

@squifi: hab beide Möglichkeiten implementiert

RE: RS Übungsblatt 11 2009-01-17 12:54
squifi
Habe ich nun auch ;)
Ist mir heute morgen eingefallen wie. ;)

RE: RS Übungsblatt 11 2009-01-17 14:53
Jushichi
hiho
hab bei Aufgabe 40 die gleichen Ergebnisse, allerdings mit weniger Nachkommastellen ^^
X nach (1): 1.288736, X nach (2): 0.007058 X nach (1): 1.332729, X nach (2): 0.916561 X nach (1): 1.144865, X nach (2): 0.448100 X nach (1): 1.054863, X nach (2): 0.896127 X nach (1): 1.292803, X nach (2): 0.060634 X nach (1): 1.049782, X nach (2): 0.021961

RE: RS Übungsblatt 11 2009-01-17 15:11
Roberto
Hey, weiss jemand, was ich bei folgender Fehlermeldung tun kann:

could not open /dev/kbd to get keyboard type US keyboard assumed
could not get keyboard type US keyboard assumed

hab ich zum ersten Mal!?


Danke :D

RE: RS Übungsblatt 11 2009-01-17 15:23
Anonymer User
http://bugs.opensolaris.org/view_bug.do;jsessionid=f433c1c49fdadea2ef99a141764?bug_id=4216258

RE: RS Übungsblatt 11 2009-01-17 15:26
Stefan1971HH
Naja, wie isoliert man das n-te Bit? Man schiebt das Register um n nach rechts und verundet mit dem Wert 1. Schon hat man das n-te Bit als 0 oder 1.

Ich mach es mir irgendwie immer zu schwer….ich hatte bisher gedacht, dass genau das nicht ginge, weil die vorderen 31 bits bei Darstellung der 1 mit Nullen gefüllt würden.

RE: RS Übungsblatt 11 2009-01-17 16:30
Fred
hab bei Aufgabe 40 die gleichen Ergebnisse, allerdings mit weniger Nachkommastellen ^^
Verwende den Formatstring %.15f
Lies: Prozent Punkt Fünfzehn Eff

could not open /dev/kbd to get keyboard type US keyboard assumed
could not get keyboard type US keyboard assumed
Einfach ignorieren, dos2unix läuft trotzdem.

ich hatte bisher gedacht, dass genau das nicht ginge, weil die vorderen 31 bits bei Darstellung der 1 mit Nullen gefüllt würden.
Ich verstehe nicht genau, was Du meinst. Natürlich schiebt und verundet man in ein temporäres Register und verändert nicht das Original, falls es darum geht.

RE: RS Übungsblatt 11 2009-01-17 16:49
Maxim
Ich verstehe irgendwie die aufgabe 41 nicht. Im Register steht doch ein Wert, der auf eine Stelle im Speicher zeigt (Speicherstelle) und nach der Aufgabenstellung ist an erster Stelle 110, an zweiter 120 usw., Heißt dass, wenn im register 123 steht, dass es die 123-ste Speicherstelle ist? Dann wäre das 123*110.

RE: RS Übungsblatt 11 2009-01-17 17:01
Stefan1971HH
Ich stolpere jetzt bei 39 noch über folgendes:
Wie formuliere ich syntaktisch korrekt folgenden Befehl:
"Verschiebe den Inhalt von Register "%l1 um diejenige (An-)zahl Stellen nach rechts,
die in %l2 gespeichert ist" ?

danke

Stefan

RE: RS Übungsblatt 11 2009-01-17 17:03
Fred
"Verschiebe den Inhalt von Register "%l1 um die jenige (An-)zahl Stellen nach rechts,
die in %l2 gespeichert ist" ?
srl %l1, %l2, zielregister

RE: RS Übungsblatt 11 2009-01-17 23:07
Roberto
Hey ihr,

Ich krieg es nicht gebacken, ein F Register in ein O Register zu legen…

Die erste Variante, die mir einfiehl klappt leider nicht^^:

mov %f6,%o1


hat jemand eine Idee???

RE: RS Übungsblatt 11 2009-01-17 23:24
Fred
Ich krieg es nicht gebacken, ein F Register in ein O Register zu legen…
Dafür gibt es keinen Befehl auf der Sparc. Workaround:
st %f6, [Adresse] ld [Adresse], %o1 Als Adresse bietet sich reservierter Platz im eigenen Stackframe an (also %fp-4 für Wörter bzw. %fp-8 für Doppelwörter), siehe Abschnitt 8.1 in meinem Tutorial.

RE: Rs Übungsblatt 11 2009-01-17 23:40
Anonymer User
Dir ist klar, dass ein Unterprogramm potentiell alle %o, %g und %f Register zerstört?

Magst du erklären, warum dies auch die %f Register betrifft, was bei printf ja tatsächlich der Fall ist? Bei den %o und %g Registern leuchtet es mir ein, aber nicht bei den %f Registern…

RE: RS Übungsblatt 11 2009-01-17 23:40
Stefan1971HH
Danke Fred.
Mein Stand bei A39:
.global main .global printf .section ".data" .align 4 a1:  .word 4000 ! die binaer auszugebende Zahl b1:  .word   31 ! für den Stellenzaehler bei der Ausgabe .section ".text" main: .align 4 set a1, %l1 ld[%l1], %o1 set b1, %l2 ld[%l2],%o2 ausbit:          save  %sp, -96,  %sp ! %i1 = 4000, %i2 = 31           ausbit_loop:     srl %i1, %i2,%l3 ! schiebt binaere Zahl um den aktuellen Zaehlerstand nach rechts     and %l3,  1, %l4 ! isoliert das nun ganz rechts stehende bit     add %l4, 48, %l5 ! wandelt es zum Zeichen     stb %l5, [%o0]   ! legt es ab     sub %o0, 1, %o0  ! legt die Adresse für das im nächsten Durchlauf zu übergebde Zeichen fest   subcc %i2, 1, %i2  ! verringert Stellenzäehler um 1 bnz ausbit_loop call printf nop jmp %i7+8 restore call ausbit nop mov  1,  %g1 ta   0
Ich knabbere noch daran, wie ich den Ausgabebefehl richitg anbringen muss.
Zusätzlich bekomme ich die Meldung :
" warning: invalid use of DCTI couple, produces implementation-dependent result"
mit Verweis auf die Zeile
bnz ausbit_loop  
Wer ist noch wach und hat Ideen?

danke,

Stefan
     

RE: RS Übungsblatt 11 2009-01-17 23:46
Fred
Dir ist klar, dass ein Unterprogramm potentiell alle %o, %g und %f Register zerstört?
Magst du erklären, warum dies auch die %f Register betrifft, was bei printf ja tatsächlich der Fall ist? Bei den %o und %g Registern leuchtet es mir ein, aber nicht bei den %f Registern…
Weil die 32 %f-Register (genau so wie die 8 %g-Register) global sind. Der save-Befehl hat keinen Einfluss darauf. Es ist nicht so, dass Unterprogramme ihre eigenen %f-Register hätten.

bnz ausbit_loop

call printf
Zwei Sprungbefehle hintereinander sind selten eine gute Idee wegen der verzögerten Sprungausführung auf der Sparc (siehe Abschnitt 6.2 in meinem Tutorial). Pack mal ein nop zwischen die beiden Befehle.

RE: RS Übungsblatt 11 2009-01-17 23:50
Stefan1971HH
Werd ich gleich versuchen.
Scheint es denn ansonsten halbwegs vernünftig…?

RE: RS Übungsblatt 11 2009-01-17 23:57
Stefan1971HH
Ok, mit dem zusätzlichen nop kompiliert es, aber beim Ausführen bewirft man mich mit einer
"Segmentation Fault" - Meldung.

Ausserdem weiss ich noch nicht recht, wie ich die Adresse des Null_Terminators angeben und die Ausgabe bewerkstelligen soll…

RE: RS Übungsblatt 11 2009-01-18 01:48
Fred
beim Ausführen bewirft man mich mit einer "Segmentation Fault" - Meldung.
Schau Dir mal diese Codezeile an:
stb %l5, [%o0] Hier schreibst Du ein Byte an die Adresse, die in %o0 gespeichert ist. Du hast %o0 aber nie mit einem sinnvollen Wert befüllt, weswegen Du an irgendeine zufällige Adresse schreibst => Segmentation Fault

RE: RS Übungsblatt 11 2009-01-18 01:57
Stefan1971HH
Danke.
Ich versuche gerade, mich von dem Programm auf Seite 24 in deinem Manual inspirieren zu lassen.

Ich müsste doch wohl auch hier %o0 mit der Adresse des Null-Terminators initialisieren?
Ich steh aber noch auf dem Schlauch, wie das umzusetzen ist.

RE: RS Übungsblatt 11 2009-01-18 02:03
Fred
Schau Dir mal die Zeilen 3 und 4 an, dort lege ich im Datensegment 11 Bytes ab (10 sinnlose Zeichen und den Null-Terminator, welcher ja durch .asciz immer erzeugt wird). Die Adresse des Null-Terminators lade ich in Zeile 12. Das fehlt in Deinem Programm, weswegen %o0 einen unsinnigen Wert hat.

RE: RS Übungsblatt 11 2009-01-18 02:13
Fred
Wobei es natürlich sauberer ist, die Zeichenkette auf dem Stack abzulegen (siehe Abschnitt 8.2).

RE: RS Übungsblatt 11 2009-01-18 02:21
Stefan1971HH
Ich weiss hier nicht recht, was ich in die Anführungszeichen nach .asciz schreiben sollte:
....... bitkette: .asciz "" ausbit: save %sp, -96, %sp ! %i1 = 4000, %i2 = 31 set bitkette + 32, %o0 ........... Ich habe es eben mal mit 32 Nullen versucht, darauf kamen plötzlich wieder diverse Fehlermeldungen.

RE: RS Übungsblatt 11 2009-01-18 02:23
Stefan1971HH
…nämlich: "error: location counter not on word boundary"
für
save %sp, -96, %sp ! %i1 = 4000, %i2 = 31
und "displacement is not a WORD displacement"
für
call ausbit

RE: RS Übungsblatt 11 2009-01-18 02:47
Fred
…nämlich: "error: location counter not on word boundary"
Bitte keine Daten im Codesegment ablegen. Und ein leerer String ist sicherlich zu kurz, um 32 Zeichen aufzunehmen.

RE: RS Übungsblatt 11 2009-01-18 02:53
Stefan1971HH
Ist klar mit dem leeren String, aber wie soll ich ihn ersetzen? irgendwelche Zeichen?
Mit den Nullen ging es ja anscheinend nicht.

RE: RS Übungsblatt 11 2009-01-18 03:04
Stefan1971HH
Ok, nun hat es diese Form:
a1: .word 4000 ! die binaer auszugebende Zahl b1: .word 31 ! für den Stellenzaehler bei der Ausgabe bitkette: .asciz "11111111111111111111111111111111" .section ".text" main: .align 4 set a1, %l1 ld[%l1], %o1 set b1, %l2 ld[%l2],%o2 .align 4 ausbit: save %sp, -96, %sp ! %i1 = 4000, %i2 = 31 set bitkette + 32, %o0 Ich erhalte keine Fehlermeldung, aber die für 4000 wohl weniger wünschenswerte Ausgabe
10000101111100000000000000000000rzdspc10$

RE: RS Übungsblatt 11 2009-01-18 03:07
Stefan1971HH
Ach, ist ja auch logisch. Ich habe deinen Algorithmus von S.24, Manual zugrundegelegt, in dem die ausgabe "umgedreht" wurde. Das ist ja hier nicht nötig.

RE: RS Übungsblatt 11 2009-01-18 06:05
Stefan1971HH
Ich konnte es lösen, indem ich %o0 mit der Adresse des Anfangs der Bitkette initialisiert habe:
set   bitkette , %o0 und dann bei jedem Schleifenduchlauf die Adresse erhöht und das nächste
Zeichen dort abegelegt habe.

Nach dem letzten Schleifendurchlauf zeigt %o0 also auf das ganz rechts stehende Zeichen,
so dass vor dem Aufruf von printf ein
sub %o0, 32, %o0 nötig ist.
Bestimmt nicht die eleganteste Lösung, aber es läuft.
Danke an Fred für das Manual und die Tips hier.

Ich ziehe mich jetzt zurück - übernächtigt, aber glücklich….

RE: RS Übungsblatt 11 2009-01-18 13:16
Anonymer User
Sagt mal gibt es eigentlich so was wie nen Debugger?
Es is irgendwie frustrierend als einzige Rückmeldung "geht" oder "geht nicht" am Ende des Programmes zu kriegen…

RE: RS Übungsblatt 11 2009-01-18 15:01
Anonymer User
Hi Leute,

für Aufgabe 41 hab ich mir das hier überlegt:

[php]
vorher nachher

1. R2 = 123; R4 = 16 R2 = 123; R4 = 138

2. R3 = 230; R4 = 16 R4 = Wert(230) + 16; R3 = 232

3. R3 = 302; R4 = 16 R3 = 300; R4 = Wert(300) + 16

4. R3 = 420; R4 = 16 R4 = Wert(450) + Wert(36)

5. R5 = 166; R3 = 12 R3 = Wert(166) + 12

6. R2 = 222; R4 = 16 R4 = Wert(222) + Wert(16); R2 = 224

7. R1 = 310; R4 = 16 R1 = 308; R4 = Wert(308) + 16

8. R1 = 148; R2 = 10 R2 = Wert(204) + Wert(112)
[/php]

Wert(xxx) soll der Wert an der Speicherstelle sein. Nur irgendwie ist mir aus der Aufgabenstellung nicht ersichtlich welchen Wert zum Beispiel Wert(204) entspricht. Dort steht: Vor Ausführung der Befehle stehen in den angesprochenen Speicherstellen die Werte 110, 120, 130, u.s.w. Leider hilft mir das irgendwie nicht. Ich hoffe mal, dass ich den Rest soweit richtig hab.

RE: RS Übungsblatt 11 2009-01-18 15:18
8kalinow
Also ich habe die gleichen Lösungen für Aufgabe 40 wie ihr auf der ersten Seite des Threads.
(1): 0 1.288736 (2): 0 0.007058 (1): 0 1.332729 (2): 0 0.916561 (1): 0 1.144865 (2): 0 0.448100 (1): 0 1.054863 (2): 0 0.896127 (1): 0 1.292803 (2): 0 0.060634 (1): 0 1.049782 (2): 0 0.021961Allerdings ist das doch garkeine Rekursion dann sondern eine simple Schleife… !?
Aufgabe 41 habe ich bisher ignoriert da die Angaben einfach nicht eindeutig sind…

RE: RS Übungsblatt 11 2009-01-18 17:45
Anonymer User
Aufgabe 41 habe ich wie folgt:[PHP]a) R2 = 123; R4 = 123+16 = 139
b) R1 = 231; R4 = 230+16 = 246
c) R3 = 301; R4 = 301+16 = 317
d) R3 = 420; R4 = 450+36 = 486
e) R5 = 166; R3 = Wert[166]+12
f) R2 = Wert[222]+1; R4 = Wert[222]+Wert[16]
g) R1 = Wert[310]-1; R4 = Wert[309]+16
h) R1 = 148; R2 = Wert[204]+Wert[112][/PHP]Kann das jemand bestätigen oder widerlegen? [21]

cYa

RE: RS Übungsblatt 11 2009-01-18 17:52
Roberto
Schönen guten Abend!

Ich bekomme hier ein "Segmentation Fault" Error….
Mein Ziel hier ist es einfach nur 0.5 + 1.0 zu rechnen…

Weiß jemand woran es liegen könnte?
Liegt es vielleicht daran, dass %o1 noch nicht definiert ist!?

! Information für Binder .global main .global printf ! Deklaration von Daten .section ".data" a: .double 0r0.5 b: .double 0r3.0 fmt: .asciz "Ergebnis: %d\n" ! Ausführbares Programm .section ".text" main: set a,%l1 ! R ist in l1 ldd [%l1],%f0 ! R ist in f0,f1 set b,%l2 ! X ist in l2 ldd [%l2],%f2 ! X ist in f2,f3 set 1,%l3 ! 1 ist in f4 als integer ldd [%l3],%f4 ! 1 ist in f4,f5 als 1.0 faddd %f0,%f4,%f6 ! R + 1 in f6,f7 st %f6,[%fp-8] ld [%fp-8],%o1 set fmt,%o0 call printf nop mov 1,%g1 ta 0

RE: RS Übungsblatt 11 2009-01-18 17:59
T
set 1,%l3 ! 1 ist in f4 als integer ldd [%l3],%f4 ! 1 ist in f4,f5 als 1.0
schreibe eine eins in register l3 lade den wert der im hauptspeicher an den adressen %l3 und %l3+1 liegt in f4 und f5
vielleicht gehört dir die hauptspeicheradresse 1 einfach nicht?

RE: RS Übungsblatt 11 2009-01-18 18:13
Anonymer User
Aufgabe 41 habe ich wie folgt:[PHP]a) R2 = 123; R4 = 123+16 = 139
b) R1 = 231; R4 = 230+16 = 246
c) R3 = 301; R4 = 301+16 = 317
d) R3 = 420; R4 = 450+36 = 486
e) R5 = 166; R3 = Wert[166]+12
f) R2 = Wert[222]+1; R4 = Wert[222]+Wert[16]
g) R1 = Wert[310]-1; R4 = Wert[309]+16
h) R1 = 148; R2 = Wert[204]+Wert[112][/PHP]Kann das jemand bestätigen oder widerlegen? [21]

cYa

bei einem Auto-Increment oder -Decrement müsstest du +-2 rechnen wenn ich nicht irre, weil die Adresse immer um ein Wort erhöht oder erniedrigt wird. Außerdem müsste in Aufgabe b) ff. auch ein Wert[xxx] stehen. Ich hab da mal folgendes gefunden: http://de.wikipedia.org/wiki/PDP-11#Adressierungsmodi. Ist irgendwie besser erklärt, als im Skript.

Autoincrement Notation: (Rn)+ in Teil b) greift auch auf den Wert der Adresse zu und erhöht danach die Adresse um ein Wort.

Hoffe das stimmt soweit.

Grüße

RE: RS Übungsblatt 11 2009-01-18 19:56
muthan
http://pages.cpsc.ucalgary.ca/~dsb/PDP11/PicModes.html#AutoiDef

sollte wohl mehr einsicht in die aufgabe bringen, ich bin bei


ADD R2, R4         |vor Ausführung: Inhalt (R2) = 123, Inhalt (R4) = 16 |nach Ausführung (R4) = 139, (R2) = 123 ADD (R1)+, R4     |vor Ausführung: Inhalt (R1) = 230, Inhalt (R4) = 16 |nach Ausführung (R4) = 146, (R1) = 232 ADD -(R3), R4     |vor Ausführung: Inhalt (R3) = 302, Inhalt (R4) = 16 |nach Ausführung (R4) = 316, (R3) = 300 ADD 30(R3), 20(R4)   |vor Ausführung: Inhalt (R3) = 420, Inhalt (R4) = 16 |nach Ausführung (R4) = 486, (R3) = 420 ADD @(R5), R3      |vor Ausführung: Inhalt (R5) = 166, Inhalt (R3) = 12 |nach Ausführung (R3) = 178, (R5) = 166 ADD @(R2)+, @(R4)   |vor Ausführung: Inhalt (R2) = 222, Inhalt (R4) = 16 |nach Ausführung (R4) = 240, (R3) = 224, (R2) = 222 ADD @-(R1), R4     |vor Ausführung: Inhalt (R1) = 310, Inhalt (R4) = 16 |nach Ausführung (R4) = 334, (R1) = 310, (R0) = 308 ADD @56(R1), @102(R2) |vor Ausführung: Inhalt (R1) = 148, Inhalt (R2) = 10 |nach Ausführung (R1) = 148, (R2) = 112, (R3) = 357, (R4)= 469

is das so richtig oder hab ich das mit dem adressierungs änderung bei @(Rn)+ und @-(Rn) falsch verstanden bzw allgemein das mit dem @

RE: RS Übungsblatt 11 2009-01-18 19:58
Anonymer User
guten abend. ich bräuchte mal hilfe bei aufgabe 40. irgendwie will mein programm nicht so richtig, und ich finde den fehler nicht. wäre echt lieb, wenn mir da jemand helfen könnte….
[PHP] .global main
.global printf


.section ".data"
.align 16
R: .double 0r3.0
X0: .double 0r0.5
eins: .double 0r1.0
spX: .skip 64 ! Reserviere Speicherplatz fuer X
spR: .skip 64 ! Reserviere Speicherplatz fuer R
fmt: .asciz "X%d = %.15f (R=%.15f)\n"
RUNS = 500 ! Maximale Durchlaeufe, dann Ausgabe
MAX = 7 ! Maximale Wiederholungen


.section ".text"

main:
mov %g0, %l0 ! Durchlaufszaehler = 0
mov %g0, %l1 ! Wiederholungszaehler = 0

set X0, %l2
set R, %l4
set eins, %l6

colonna1:
ldd [%l2], %f2 ! 0.5 –> %f2 = X
ldd [%l4], %f4 ! 3.0 –> %f4 = R
ldd [%l6], %f6 ! 1.0 –> %f6 = 1.0

loop1:
inc %l0 ! Durchlaufszaehler erhoehen
faddd %f4, %f6, %f8 ! %f6 = (R+1.0)
fmuld %f8, %f2, %f8 ! %f8 = (R+1.0)*X
fmuld %f2, %f2, %f10 ! %f10 = (X*X)
fmuld %f2, %f10, %f10 ! %f12 = R*(X*X)

fsubd %f8, %f10, %f2 ! %f2 = (R+1.0)*X - R*(X*X)
faddd %f4, %f6, %f4 ! %f4 = (R+1.0)

cmp %l0, RUNS ! 500 Durchlaeufe erreicht?
blu loop1 ! Wenn nicht, wiederhole
nop

set fmt, %o0
smul %l0, %l1, %o1 ! %o1 = Durchlaufszaehler * Wiederholungszaehler (Gesamtzaehler)

set spX, %l2 ! %l2 = Speicheradresse fuer X
std %f2, [%l2] ! %f2 –> Adresse in %l2
ld [%l2], %o2 ! Wert an Adresse in %l2 –> %o2

set spR, %l4 ! %l4 = Speicheradresse fuer R
std %f4, [%l4] ! %f4 –> Adresse in %l4
ld [%l4], %o3 ! Wert an Adresse in %l4 –> %o3

call printf ! Ausgeben
nop

inc %l1 ! Wiederholungszaehler erhoehen
mov %g0, %l0 ! Durchlaufszaehler = 0
cmp %l1, MAX ! 6 Wiederholungen (3000 Durchlaeufe) erreicht?
blu colonna1
nop

mov 1, %g1
ta 0[/PHP]
ausgabe:X0 = NaN (R=-68584587174475005545606316327708065889509118485241942378455852983615244904879348860483395232045652639102016026770283045413166201873950791145628284911251902676284184684706196479933943278352972086375315231416112224751162110567302661454328855412852760450441585854552134779652496244950535544048244179895058432.000000000000000) X500 = NaN (R=-54557534967090803614285873686720147174045254246277987931484333806387280058113128940192688599038482588006943493720751849848171610448042706051583307551423490470277527653281350857670058769520140249686766806799044081554032656016585414445825419295674711148794446188036578089094618467276352282548313255502151680.000000000000000) X1000 = NaN (R=-54557534967090823104913896486718307880810029996654609683938048996402333793926043366090070131890687519237075257741270300458004073265379072969923037957611583626252120278588189920225458682466199991266077786906340787153219614453343161817021270085424602641521677125967803744572224675831446446205493239330373632.000000000000000) X1500 = NaN (R=-54557534967090832850227907886717388234192417871842920560164906591409860661832500579038760898316789984852141139751529525762920304674047256429092903160705630204239416591241609451503158638939229862055733276959989139952813093671722035502619195480299548387885292594933416572311027780108993528034083231244484608.000000000000000) X2000 = NaN (R=-54557534967090832850227907886717388234192417871842920560164906591409860661832500579038760898316789984852141139751529525762920304674047256429092903160705630204239416591241609451503158638939229862055733276959989139952813093671722035502619195480299548387885292594933416572311027780108993528034083231244484608.000000000000000) X2500 = NaN (R=-54557534967090832850227907886717388234192417871842920560164906591409860661832500579038760898316789984852141139751529525762920304674047256429092903160705630204239416591241609451503158638939229862055733276959989139952813093671722035502619195480299548387885292594933416572311027780108993528034083231244484608.000000000000000) X3000 = NaN (R=-54557534967090832850227907886717388234192417871842920560164906591409860661832500579038760898316789984852141139751529525762920304674047256429092903160705630204239416591241609451503158638939229862055733276959989139952813093671722035502619195480299548387885292594933416572311027780108993528034083231244484608.000000000000000)

die ausgaben müssten ja eigentlich beim ersten mal die standardwerte sein, also "X0 = 0.5 (R=3.0)"…
also R spielt komplett verrückt und X kann er ja auch nicht wirklich berechnen, wenn R rumspinnt.

RE: RS Übungsblatt 11 2009-01-18 20:03
Julian F.
Sagt mal gibt es eigentlich so was wie nen Debugger?
Es is irgendwie frustrierend als einzige Rückmeldung "geht" oder "geht nicht" am Ende des Programmes zu kriegen…
Zum Debuggen bei Abstürzen empfiehlt sich der folgende einfache Trick: Füge die Zeilen
loop: ba loop nopungefähr dort in dein Programm ein, wo du die Absturzursache vermutest. Es handelt sich um eine einfache Endlosschleife. Wenn das Programm hinterher abstürzt, liegt der Fehler vor der Schleife; wenn es sich aufhängt (beenden mit Strg+C), liegt er dahinter.

RE: RS Übungsblatt 11 2009-01-18 20:53
8kalinow
Wieso änderst du R??

edit:
Du speicherst nen double, lädst aber nur singles…

RE: RS Übungsblatt 11 2009-01-18 21:02
squifi
set spX, %l2 ! %l2 = Speicheradresse fuer X
std %f2, [%l2] ! %f2 –> Adresse in %l2
ld [%l2], %o2 ! Wert an Adresse in %l2 –> %o2

set spR, %l4 ! %l4 = Speicheradresse fuer R
std %f4, [%l4] ! %f4 –> Adresse in %l4
ld [%l4], %o3 ! Wert an Adresse in %l4 –> %o3

Gibst dadurch nur einen Teil der Zahl aus, soviel schon mal.
Bin mir auch nicht sicher mit der Spiecherreservierung, könnte die Zahl verursachen.

spX: .skip 64 ! Reserviere Speicherplatz fuer X
spR: .skip 64 ! Reserviere Speicherplatz fuer R

RUNS = 500 ! Maximale Durchlaeufe, dann Ausgabe
MAX = 7 ! Maximale Wiederholungen

Kenne ich gar nicht für die SPARC, habe ich zumindest nicht im Skript gesehen bis jetzt.
erklär mal.

RE: RS Übungsblatt 11 2009-01-18 21:17
Anonymer User
Hey bräuchte mal schnell Hilfe.
Also mein Programm läuft sowiet nru die Ausgabe ist nicht gerade die, die es sein soll.^^"

Also mein Quelltext:

! Information fuer Binder
.global main
.global printf

! Deklaration von Daten
.section ".data"
.align 8
R: .double 0r3.0
s: .word 0
x0: .double 0r0.5
x1: .double 0r0.0
x2: .double 0r1.0
x3: .double 0r0.0

fmt: .asciz "Empfindlichkeit von Gleitpunktrechnung:\n\n"
fmt2: .asciz "x500: %.15f\n\n"
fmt3: .asciz "x1000: %.15f\n\n"
fmt4: .asciz "x1500: %.15f\n\n"
fmt5: .asciz "x2000: %.15f\n\n"
fmt6: .asciz "x2500: %.15f\n\n"
fmt7: .asciz "x3000: %.15f\n\n"

! ausfuehrbares Programm
.section ".text"

meth1:
save %sp, -112, %sp

st %i1, [%fp-8]
st %i2, [%fp-4]
st %i3, [%fp-16]
st %i4, [%fp-12]
ldd [%fp-8], %f0 ! x0 in f0 und f1
ldd [%fp-16], %f2 ! R in f2 und f3

set s, %l1
ld [%l1], %l1 ! Schleifenzaehler initialisieren

set x1, %l2
ldd [%l2], %f12 ! 0 in f12 und f13

set x2, %l3
ldd [%l3], %f14 ! 1 in f14 und f15

schleife:
fmovs %f12, %f4 ! 0 nach f4 und f5
fmovs %f13, %f5

fmovs %f0, %f6 ! x0 nach f6 und f7
fmovs %f1, %f7

fmuld %f0, %f6, %f6 ! X*X in f6 und f7
fmuld %f2, %f6, %f6 ! R*(X*X) in f6 und f7

fmovs %f0, %f8 ! x0 nach f8 und f9
fmovs %f1, %f9

faddd %f2, %f14, %f10 ! R = R+1


fmuld %f10, %f8, %f8 ! f8 und f9 = (R+1)*X

faddd %f4, %f8, %f4 ! X = (R+1)*X
fsubd %f4, %f6, %f4 ! X = (R+1)*X - R*(X*X)

inc %l1

cmp %l1, 3000 ! Letzte Bildschirmausgabe bei x3000
be ende
nop

cmp %l1, 2500 ! Fuenfte Bildschirmausgabe bei x2500
be five
nop

cmp %l1, 2000 ! Vierte Bildschirmausgabe bei x2000
be four
nop

cmp %l1, 1500 ! Dritte Bildschirmausgabe bei x1500
be three
nop

cmp %l1, 1000 ! Zweite Bildschirmausgabe bei x1000
be two
nop

cmp %l1, 500 ! Erste Bildschirmausgabe bei x500
be one
nop

cmp %l1, 3000
ble schleife
nop

one:
set x3, %l4
std %f4, [%l4]
ld [%l4], %o1
ld [%l4+8], %o2

set fmt2, %o0 ! Erste Ausgabe bei x500

call printf
nop

ba schleife
nop

two:
set x3, %l4
std %f4, [%l4]
ld [%l4], %o1
ld [%l4+8], %o2

set fmt3, %o0 ! Zweite Ausgabe bei x1000

call printf
nop

ba schleife
nop

three:
set x3, %l4
std %f4, [%l4]
ld [%l4], %o1
ld [%l4+8], %o2

set fmt4, %o0 ! Dritte Ausgabe bei x1500

call printf
nop

ba schleife
nop

four:
set x3, %l4
std %f4, [%l4]
ld [%l4], %o1
ld [%l4+8], %o2

set fmt5, %o0 ! Vierte Ausgabe bei x2000

call printf
nop

ba schleife
nop

five:
set x3, %l4
std %f4, [%l4]
ld [%l4], %o1
ld [%l4+8], %o2

set fmt6, %o0 ! Fuenfte Ausgabe bei x2500

call printf
nop

ba schleife
nop

ende:
set x3, %l4
std %f4, [%l4]
ld [%l4], %o1
ld [%l4+8], %o2

set fmt7, %o0 ! Letzte Ausgabe bei x3000

call printf
nop

jmp %i7+8
restore

main:
set fmt, %o0 ! fmt
call printf
nop

set x0,%l1 ! Die gewuenschte Zahl ins das Register l1 laden
ldd [%l1],%f2 ! x0 in %f2, %f3
set R, %l2 ! R ins f4 und f5
ldd [%l2],%f4

std %f2, [%l1] ! double x0 nach l1+8
ld [%l1], %o1 ! l1+8 nach o1
ld [%l1+4], %o2 ! l1+12 nach o2

std %f4, [%l2] ! double R nach o3 und o4
ld [%l2], %o3
ld [%l2+4], %o4

call meth1
nop

set 1,%g1
ta 0

Und meine Ausgabe dazu, die mri angezeigt wird:
Empfindlichkeit von Gleitpunktrechnung:

x500: 1.250000258637578

x1000: 2147482846677198336.000000000000000

x1500: 0.000000000000000

x2000: 2147482846677198336.000000000000000

x2500: 0.000000000000000

x3000: 2147482846677198336.000000000000000

RE: RS Übungsblatt 11 2009-01-18 21:23
squifi
set x3, %l4
std %f4, [%l4]
ld [%l4], %o1
ld [%l4+8], %o2

So wie ich das verstanden habe, lädst Du x3 in Ausgaberegister %o1 und %o2.

x3: .double 0r0.0 deklariert.
Also gibst Du ganz oft einfach nur x3 aus.

RE: RS Übungsblatt 11 2009-01-18 21:34
Fred
RUNS = 500        ! Maximale Durchlaeufe, dann Ausgabe
    MAX = 7            ! Maximale Wiederholungen
Kenne ich gar nicht für die SPARC, habe ich zumindest nicht im Skript gesehen bis jetzt.
erklär mal.
Damit werden symbolische Konstanten definiert, welche nur zur Übersetzungszeit existieren. Ist praktisch, weil Du so alle Schrauben, an denen Du drehen kannst, ganz am Anfang des Programms versammeln kannst.

RE: RS Übungsblatt 11 2009-01-18 21:42
Anonymer User
set x3, %l4
std %f4, [%l4]
ld [%l4], %o1
ld [%l4+8], %o2

Das heißt doch erstmal, ich setze x3 in %l4
und anschließend %f4 auf die Adresse von l4
dann Adresse von l4 in o1
Adresse von l4+8 in o2

DIe erste Ausgabe scheitn ja auch richtig zu sein nur alel anderen nicht.

RE: RS Übungsblatt 11 2009-01-18 22:57
Rolf
Hi Leute,

für Aufgabe 41 hab ich mir das hier überlegt:

[php]
vorher nachher

1. R2 = 123; R4 = 16 R2 = 123; R4 = 138

2. R3 = 230; R4 = 16 R4 = Wert(230) + 16; R3 = 232

3. R3 = 302; R4 = 16 R3 = 300; R4 = Wert(300) + 16

4. R3 = 420; R4 = 16 R4 = Wert(450) + Wert(36)

5. R5 = 166; R3 = 12 R3 = Wert(166) + 12

6. R2 = 222; R4 = 16 R4 = Wert(222) + Wert(16); R2 = 224

7. R1 = 310; R4 = 16 R1 = 308; R4 = Wert(308) + 16

8. R1 = 148; R2 = 10 R2 = Wert(204) + Wert(112)
[/php]

Wert(xxx) soll der Wert an der Speicherstelle sein. Nur irgendwie ist mir aus der Aufgabenstellung nicht ersichtlich welchen Wert zum Beispiel Wert(204) entspricht. Dort steht: Vor Ausführung der Befehle stehen in den angesprochenen Speicherstellen die Werte 110, 120, 130, u.s.w. Leider hilft mir das irgendwie nicht. Ich hoffe mal, dass ich den Rest soweit richtig hab.

Ich hab genau die gleichen Ergebnisse raus.
Wollt dich aber drauf aufmerksam machen, dass bei 1) 123+16 139 sind. [24]

Und sonst… ich nehm jetzt einfach an, dass der Satz in der Aufgabe sich auf die Werte vor Ausfuehrung beziehen und dass 110, 120 usw. nur Beispiele sind, um uns zu verwirren. [26]
Habs auch ohne Konkrete Werte, sondern mit den Adressen und so gemacht.

RE: RS Übungsblatt 11 2009-01-18 23:20
Anonymer User
Dank der nicht eindeutigen Aufgabenstellung habe ich erstmal alle benötigten Speicherstellen rausgeschrieben & anschließend fortlaufend befüllt mit den vorgegebenen Werten 110, 120, 130, u.s.w.. Hoffe das wird bei Abgabe als korrekt gewertet, denn eine andere Möglichkeit gibt es imho nicht:
[PHP]Speicherstelle(16) = 110
Speicherstelle(36) = 120
Speicherstelle(112) = 130
Speicherstelle(166) = 140
Speicherstelle(204) = 150
Speicherstelle(222) = 160
Speicherstelle(230) = 170
Speicherstelle(300) = 180
Speicherstelle(308) = 190
Speicherstelle(450) = 200[/PHP]

RE: RS Übungsblatt 11 2009-02-12 11:00
Anonymer User
Hat jemand eine endgültige richtige lösung zu Aufg. 41

RE: RS Übungsblatt 11 2009-02-12 11:28
Fred
Oh, meine Assemblerlösungen hatte ich ja noch gar nicht gepostet.
Anhänge 11drucken.pdf