FB18 - Das Forum für Informatik

fb18.de / Bachelorstudieng / PM Technische Informatik

RS Assembler Programmierung

RS Assembler Programmierung 2008-01-12 15:50
Eddie_Zerodyne_Unreg
Hi,

aus den Folien
http://www.informatik.uni-hamburg.de/TKRN/world/abro/RS/rsk05ws07a.pdf
wird es mir nicht deutlich wie genau die Programmierung im Assembler funktioniert.

1.
Deklaration von Daten
.section ".data"
b1: .single 0r3.050502
b2: .single 0r0.202020

woher bekomme ich und was sind diese zahlen? (0r3.050502, bzw 050502)

2.
wie ist das bitte gemeint?
(ist die syntax fürs addieren)
add rs1, rs2/imm13, rd

also ich denke mir das so:
Add ist der befehl, dann nehme ich register1 und register2 und addiere sie und packe es in register3. wäre das so richtig?

hier der aufgabenzettel
Aufgabenblatt

Wozu brauche ich eigentlich Variablen wenn ich die daten von reg1 zu reg2 usw immer wieder schiebe?
Und wie initialisier ich eine variable?

RE: RS Assembler Programmierung 2008-01-12 16:59
Fred
Add ist der befehl, dann nehme ich register1 und register2 und addiere sie und packe es in register3. wäre das so richtig?
Ja.

Wozu brauche ich eigentlich Variablen wenn ich die daten von reg1 zu reg2 usw immer wieder schiebe?
Du hast ja nicht unendlich viele Register. Wenn Du in einem kleinen Programmabschnitt nur 2, 3 Variablen brauchst, dann kannst Du einfach Register dafür nehmen. Wenn Du aber z.B. ein Array von 1000 Werten brauchst, dann hast Du dafür nicht genügend Register und musst auf den Hauptspeicher ausweichen.

RE: RS Assembler Programmierung 2008-01-12 17:20
Eddie_Zerodyme_Unreg
okay danke dir Fred,

Auf der Folie wird, die eigentliche rechnung mit .section ".text" angefangen, was genau ist das?

.section ".text"
main: sethi %hi(b1), %l1




und wäre noch nett wenn jemand meine 1. frage mit der Deklaration beantwortet würde.

Nochmal ganz kurz: Wie deklariere ich etwas?

auf der Folie steht folgendes:
x: .word 0x3fce ! 32 Bit Größe
y: .half 0x1f3 ! 16 Bit Größe
z: .byte 0x1f ! 8 Bit Größe
a: .single 0r3.2 ! 32 Bit Größe
b: .double 0r2E10 ! 64 Bit Größe
c: .quad 0r1.414 ! 128 Bit Größe

aber ist das immer so? den im beispielprogramm steht:

b1: .single 0r3.050502

RE: RS Assembler Programmierung 2008-01-12 18:54
Fred
Auf der Folie wird, die eigentliche rechnung mit .section ".text" angefangen, was genau ist das?
Das Codesegment. Das ist der Bereich, in dem ausführbarer Code steht.

.section ".text" <--- hier fängt das Codesegment an, nachfolgend steht also ausführbarer Code main: sethi %hi(b1), %l1 <--- main ist der Einstiegspunkt, und sethi... ist der erste Befehl des Programms
Nochmal ganz kurz: Wie deklariere ich etwas?

auf der Folie steht folgendes:
x: .word 0x3fce ! 32 Bit Größe
y: .half 0x1f3 ! 16 Bit Größe
z: .byte 0x1f ! 8 Bit Größe
a: .single 0r3.2 ! 32 Bit Größe
b: .double 0r2E10 ! 64 Bit Größe
c: .quad 0r1.414 ! 128 Bit Größe
Und genau so funktioniert es auch. Erst ein Label (ein Name), dann die Angabe des Typs, dann der Startwert.

Solche Deklarationen sollten sinnvollerweise im Datensegment stehen, also hinter .section ".data" (Variablen) oder .section ".rodata" (Konstanten).

RE: RS Assembler Programmierung 2008-01-12 23:31
Anonymer User
okay danke das hilft weiter.

Gibt es eine möglichkeit eine schleife zu bauen?

ich nehme an das macht man über sprungbefehle, aber ich habe nicht genug ahnung.
kann mir jemand kurz dazu etwas schreiben?

RE: RS Assembler Programmierung 2008-01-12 23:53
TriPhoenix
Dazu schnappst du dir die Bedingten Sprünge von Seite 21 im PDF. Zum Vergleichen der Zahlen nutzt du aus, dass die cc-Varianten eines jeden Befehles die Bedingungsanzeigen schreiben. Auf jene reagieren dann ja die Bedingten Sprungbefehle. Ein Beispiel dazu vielleicht:

; Schleifenbeispiel add %g0, 10, %l0 add %g0, 4, %l1 sprungziel: sub %l0, 1, %l0 subcc %l0, %l1, %g0 bpos sprungziel nop
Und was passiert nun? Die ersten beiden Zeilen setzen %l0 auf 10 und %l1 auf 4 (man bedenke, dass %g0 ja IMMER 0 ist). Dann kommt die Schleife, zuerst wird %l1 von %l0 abgezogen, das Ergebnis wird in %g0 gespeichert (also wegen der Sonderbehandlung von %g0 weggeschmissen) und die Ergebnisanzeigen gesetzt. Man bemerke: die Negativ-Anzeige wird ja dann gesetzt, wenn das Ergebnis negativ ist, also quasi erst wenn %l0 kleiner ist als %l1. Dann wird von %l0 einer abgezogen. Zum Schluss wird nach "sprungziel" gesprungen, wenn die Negativ-Anzeige nicht gesetzt war. Nicht gesprungen wird also nur, wenn %l0 kleiner als %l1 ist. Und das "nop" hinter dem Sprungbefehl nicht vergessen ;) Wenn man das jetzt mal alles zusammenfasst in Pseudocode, hat man sowas:

l0 = 10 l1 = 4 do { l0 = l0 - 1 } until (l0 < l1)
Effektiv also eine Schleife, die l0 bis zu einer gewünschten Grenze runterzählt. Mit den anderen Ereignisanzeigen lassen sich dann alle möglichen Vergleiche machen, oft läuft es eben auf einen subcc-Befehl mit Ziel %g0 hinaus (zum Vergleichen) und einen der B-Befehle zum bedingten Springen.

HTH

RE: RS Assembler Programmierung 2008-01-13 20:09
Loom
Deklaration von Daten
.section ".data"
b1: .single 0r3.050502
b2: .single 0r0.202020

woher bekomme ich und was sind diese zahlen? (0r3.050502, bzw 050502)

Da das die Deklaration ist bekommst du das aus der Aufgabenstellung bzw. deinem kreativem Hirn. Die Zahlen sind Fließkommazahlen. Also reelle Zahlen, was durch 0r gekennzeichnet wird. Nach dem 0r kommt die eigentliche Zahl. Aus dem englischen mit Punkt statt Komma. Das gute alte Pi wäre:
pi: .single 0r3.14159
Aus deinem Beispiel ist also "b1 = 3,050502" und "b2 = 0,202020"