So, hier der offizielle Thread zum Aufgabenblatt 6 [img]
http://www.sternenvolk.de/symb/7.gif[/img]
Man muss es zwar nicht abgeben, aber vielleicht bearbeitet Ihr es ja trotzdem und es ergeben sich spannende Diskussionen…
LoL. Schon wieder nicht abgeben? Bunte Runde. Ich habe aber erst morgen um 10 Uhr meine Übung. Worum geht es denn dieses Mal?
LoL. Schon wieder nicht abgeben? Bunte Runde.
Versteh ich ehrlich gesagt auch nicht, was das soll.
Ich habe aber erst morgen um 10 Uhr meine Übung. Worum geht es denn dieses Mal?
Es soll eine Funktion in Assembler geschrieben werden, die als Parameter ein Zeichen bekommt, und die Funktion soll auf dem Bildschirm ausgeben, ob es sich um ein
* Steuerzeichen
* nicht sichtbares Zeichen
* Kleinbuchstabe
* Grossbuchstabe
* Ziffer
* sonstiges Zeichen
handelt. Allerdings benutzen wir nicht den ASCII-Code, sondern den EBCDIC-Code, habe ich uebrigens noch nie was von gehoert (der ist aber auf dem Zettel mit abgedruckt).
Fred will PostMaster werden… [img]
http://www.sternenvolk.de/symb/15.gif[/img]
Fred will PostMaster werden… [img]http://www.sternenvolk.de/symb/15.gif[/img]
Noch tausend Posts und ich habe Bjoern eingeholt!
Glueckwunsch Fred:
In unserer Uebungsgruppe wurde deine Loesung zu Blatt 5
vorgestellt, u.a. weil sie so elegant ("if-Teil") war.
Glueckwunsch Fred:
In unserer Uebungsgruppe wurde deine Loesung zu Blatt 5
vorgestellt, u.a. weil sie so elegant ("if-Teil") war.
Herr Polizeipräsident, ich fühle mich geehrt, aber ich mag solche schemelhaften Anbiederungsversuche überhaupt nicht, das wissen Sie ganz genau. Äh, es ist, mit - mit der Blume, das ist nicht, äh, mit der Blume will ich nicht haben…
Trotzdem danke für die Blumen [img]
http://www.sternenvolk.de/symb/25.gif[/img]
Es gab nebenbei bemerkt sicher noch mehr Lösungen, die das if wegoptimiert haben, die aber erst am Sonntag abend abgegeben haben.
Es soll eine Funktion in Assembler geschrieben werden, die als Parameter ein Zeichen bekommt, und die Funktion soll auf dem Bildschirm ausgeben, ob es sich um ein
* Steuerzeichen
* nicht sichtbares Zeichen
* Kleinbuchstabe
* Grossbuchstabe
* Ziffer
* sonstiges Zeichen
handelt. Allerdings benutzen wir nicht den ASCII-Code, sondern den EBCDIC-Code, habe ich uebrigens noch nie was von gehoert (der ist aber auf dem Zettel mit abgedruckt).
So, heute ist Freitag, hat irgendjemand von Euch den Kram schon gemacht? [img]
http://www.sternenvolk.de/symb/7.gif[/img]
Jupp.
Ist aber eigentlich nur Schreibarbeit, und amsonsten muss man darauf achten, dass man ggf. an die richtigen Stellen wieder zurückspringt. Allerdings ist meine wohl nicht die Ideale Lösung, aber.. hauptsache, sie funktioniert [img]
http://www.sternenvolk.de/symb/23.gif[/img]
So, heute ist Freitag, hat irgendjemand von Euch den Kram schon gemacht? [img]http://www.sternenvolk.de/symb/7.gif[/img]
Ebenso jup :)
Wie Zaphod shcon sagt, ne Menge schreibarbeit nach dem Schema vergleichen und branchen, soll angeblich üben sowas :>
debug-tipp:
falls eine .s datei schön compiliert, aber beim ausführen nur
'segmentation fault' (oder so ähnlich) sagt,
dann kann es an der zeile
'.section "text"'
statt
'.section ".text"'
liegen ;),
da kann man durchaus ein paar minütchen suchen..
ne Menge schreibarbeit nach dem Schema vergleichen und branchen
Kleiner Tip: die Aufgabe festzustellen, in welche Kategorie das uebergebene Zeichen faellt, kann man auch als Bereitstellung einer Funktion f(x) verstehen. x ist dabei das Zeichen, f(x) beispielsweise eine Zahl zwischen 0 und 5. Der Definitionsbereich von x ist endlich und auch nicht besonders gross (0-255), warum also muehsam vergleichen, wenn man alle 256 moeglichen f(x) einfach aufzaehlen kann?
Wahrscheinlich haben die meisten bedingte Spruenge verwendet, weil die beim letzten Uebungsgruppentermin so intensiv besprochen wurden - aber auf dem Aufgabenzettel steht von bedingten Spruengen kein Wort!
gute idee. look-up-table und fertig ist der lack.
gute idee. look-up-table und fertig ist der lack.
Knapp und praezise formuliert, ja genau das meinte ich [img]
http://www.sternenvolk.de/symb/25.gif[/img]
Damit reduziert sich der Code auf 10 Zeilen.
das klingt durchaus nett,
aber ich hab grad keine vorstellung, wie das in assembler aussieht, diese aufzählungen,
wär nett wenn du da ein beispiel oder eben die 10 zeilen der aufgabe postest [img]
http://www.sternenvolk.de/symb/23.gif[/img]
Och wie unspannend Slater. Keinen Ehrgeiz das selbst hinzubekommen? Nehm' Dir doch mal Zeit und schiebe den P Kram ein wenig beiseite. ;)
pff,
"wenn jeder mensch beim erfinden des rads anfängt.. usw"
ich hab grad keine vorstellung, wie das in assembler aussieht, diese aufzählungen
Du definierst Dir einfach im Datensegment 256 aufeinanderfolgende Bytes. Diese stehen dann byte-aligned hintereinander im Speicher, ein Array sozusagen. Das erste Byte ist dann f(0), das naechste f(1) und so weiter.
.section ".data"
aufzaehlung: .byte 5, 2, 8, 4, 1, 0, 9, 3, 5, 66, 22, -1, …
schick schick
im sinne von verwendung wär durchaus noch interessant, wie man nun darauf zugreifen kann,
aber du brauchst mir jetzt auch nicht die ganze programmiersprache erklären, das sind ja bisher nicht behandelte konstruktionen,
hast vielleicht stattdessen einen deiner berühmten links? ;)
im sinne von verwendung wär durchaus noch interessant, wie man nun darauf zugreifen kann,
aber du brauchst mir jetzt auch nicht die ganze programmiersprache erklären, das sind ja bisher nicht behandelte konstruktionen,
hast vielleicht stattdessen einen deiner berühmten links? ;)
Ich hab jetzt keinen Bock eine entsprechende Seite zu suchen ;)
Du brauchst einen Zeiger auf das Array. (In Assembler sagt man statt Array auch gerne Tabelle, Look-Up-Table, Vektor… das heisst alles das gleiche.) Diesen Zeiger bekommst Du per sethi/or. Der Zeiger zeigt somit auf das erste Element der Tabelle. Da du aber nicht an dem ersten Element interessiert bist, musst Du noch das Zeichen draufaddieren. Danach zeigt der Zeiger auf das Element in der Tabelle, das dem Zeichen entspricht. Dieses Byte kannst Du Dir per ldub holen und weiterverarbeiten.
falls eine .s datei schön compiliert, aber beim ausführen nur 'segmentation fault' (oder so ähnlich) sagt,
…kann es auch an folgendem liegen: das Minus bei save %sp,-112,%sp vergessen :-) Bis ich das gefunden hatte…
[falls eine .s datei schön compiliert, aber beim ausführen nur 'segmentation fault' (oder so ähnlich) sagt] kann es auch an folgendem liegen: das Minus bei save %sp,-112,%sp vergessen
Ist eigentlich allen klar, warum da negative Zahlen hingehoeren? Und warum man keine groesseren Zahlen als -64 verwenden darf?
Du mußt hier nicht den Lehrer spielen, du kannst es uns gleich sagen. Ich habe beim Lesen das Gefühl, als würdest du mit mir die T- oder P-Übung machen [img]
http://www.sternenvolk.de/symb/7.gif[/img]
Du mußt hier nicht den Lehrer spielen, du kannst es uns gleich sagen. Ich habe beim Lesen das Gefühl, als würdest du mit mir die T- oder P-Übung machen [img]http://www.sternenvolk.de/symb/7.gif[/img]
Eigentlcih war ich nur gerade bissle muede, dass alles zu schreiben, naja und Lehrer spielen macht mir Spass, ich gebs ja zu [img]
http://www.sternenvolk.de/symb/7.gif[/img]
Also der Stack waechst von oben nach unten (deswegen negative Zahlen), und die 64 Bytes braucht man zum Retten der lokalen Register und der out-Register, wenn der Prozessor in eine Falle tappt.
NP: Helge Schneider - Tiere
Und warum mal -104 und mal -112?
Und warum mal -104 und mal -112?
Das musst Du selbst rausfinden, ich weiss es nicht. Ich vermute mal, der Compiler ist einfach bloede [img]
http://www.sternenvolk.de/symb/23.gif[/img]
Und warum mal -104 und mal -112?
Das musst Du selbst rausfinden, ich weiss es nicht. Ich vermute mal, der Compiler ist einfach bloede [img]http://www.sternenvolk.de/symb/23.gif[/img]
De rlegt da bestimmt irgendwelchen Kram ab [img]
http://www.sternenvolk.de/symb/28.gif[/img] Meine Programme sind bisher alle mit -64 glücklich geworden
Was heisst hier, der Compiler ist bloede :-) Ihr wisst doch sonst alles, wofuer ist die Zahl ueberhaupt da? Ich habe keine Ahnung, ich hab sie immer einfach abgetippt ;-)
der compiler macht soviel platz, wie er meint zu brauchen, 64 sind plicht, und dann zählt er wahrscheinlich die anzahl der codezeilen oder sonstwas.. [img]
http://www.sternenvolk.de/symb/28.gif[/img]
64 Byte, um die Register / Flags und was die Sparc sonst noch so zu bieten hat zu sichern.
Ich dachte, das Fenster wird um einen festen Wert verschoben? Das las ich zumindest aus der schoenen Grafik in dem kleinen T3-Heftchen raus. So dass sich halt immer 8 Register ueberlappen.
Ich dachte, das Fenster wird um einen festen Wert verschoben? Das las ich zumindest aus der schoenen Grafik in dem kleinen T3-Heftchen raus. So dass sich halt immer 8 Register ueberlappen.
Ja, die Sache mti den 64 Byte auf dem Stack ist ne andere. Stell dir mal vor, mitten im Betrieb tritt ein Interrupt (bei Sparc trap genannt) auf, das Betriebssystem muss iich um eine Ausnahmesituation kümmern, sei es weil das Programm fehlerhaft arbeitet, was in den Speicher eingelagert werden muss oder ein Stück Hardware was will. Dann muss das Betriebssystem einschreiten und da Traps ziemlich oft auftreten können, sollte das auch schnell passieren. Damit das unterbrochene Programm nichts von alledem merkt, speichert der Prozessor schnell alle Register ab, und zwar auf dem Bereich ab %sp bis %sp+64. Deswegen muss dieser Bereich frei bleiben, weil zu jedem Zeitpunkt eine Trap auftreten könnte und die dort liegenden Daten Platt machen kann
wie, kein topic zu blatt 7?
schreib ich mal hier mein stolzes programm hin und hoffe auf übersichtlichere alternativen
.section ".text"
.global division
division:
save %sp, -128, %sp
cmp %i1, 0 ! bei divison durch 0 erst mal abbruch ;)
ble .exit
nop
mov %i0, %l0 ! l0 = divident (das 32 bit lange)
mov %i1, %l1 ! l1 = divisor (das 16 bit lange)
!laenge des divisors berechnen:
mov %g0, %l2 ! l2 = laenge des divisors
.laengeschleife:
srl %l1, 1, %l1 ! divisor nach rechts shifen bis null
add %l2, 1, %l2 ! dabei mitzaehlen
cmp %l1, 0
bg .laengeschleife
nop
! division durchfuehren:
mov %i1, %l1 ! l1 = divisor (das 16 bit lange)
mov 32, %l3 ! divisor auf laenge des dividenten shiften
sub %l3, %l2, %l3 ! (l3 = anzahl der shifte, 32-laenge)
sll %l1, %l3, %l1
mov 0, %l4 ! l4 = divisonsergebnis
cmp %l2, 16 ! keine Division, wenn Divisor zu gross
bge .divisionfertig
nop
.divisionsschleife:
sll %l4, 1, %l4 ! ergebnisregister schieben fuer neue 1 oder 0
xor %l0, %l1, %l3 ! test ob 1 oder 0 bei aktueller div
cmp %l3, %l0 ! l3 = Testregister
bg .nachxor
nop
cmp %l3, 0
bl .nachxor
nop
add %l4, 1, %l4 ! -> 1 bei aktueller div..
xor %l1, %l0, %l0 ! xor anwenden
.nachxor: ! -> 0 bei aktueller div..
srl %l1, 1, %l1 ! divisor nach rechts schieben
! divisionsbedingung:
cmp %i1, %l1 ! ende wenn divisor ganz rechts
ble .divisionsschleife
nop
.divisionfertig:
set fmt, %o0 ! Ausgabe der Parameter
mov %i0, %o1
mov %i1, %o2
call printf
nop
set fmt2, %o0 ! Ausgabe Ergebnis, Rest
mov %l4, %o1
mov %l0, %o2 ! Rest ist, was in l0 vom Dividenden
! uebrig blieb..
call printf
nop
.exit:
jmp %i7 +8
restore
.section ".rodata"
fmt: .asciz "Divident: %d, Divisor: %d\n\n"
fmt2: .asciz "Ergebnis der Divison: %d, Rest: %d\n\n"
edit
ach ich seh grad selber, das ich den teil mit der laenge des divisors gar nicht mehr brauch..,
das ich auch immer so früh von der uni nach hause fahren muss ;)
EDIT: argh, eben ne veraltete Version gepostet. Hier die richtige [img]
http://www.sternenvolk.de/symb/7.gif[/img]
division:
save %sp, -64, %sp
call no_leading_zeroes
mov %i0, %l0 ! Divident normieren
mov %l0, %l2
mov %l1, %l3
call no_leading_zeroes
mov %i1, %l0 ! Divisor normieren
mov %l0, %l4
mov %l1, %l5
set printf_text, %o0
mov %i0, %o1
mov %i1, %o2
mov %g0, %o3
subcc %l5, %l3, %l6
bl ausgeben
mov %i1, %o4
add %l6, 1, %l6
xorschleife:
cmp %l2, %g0
bpos passt_nicht
sll %o3, 1, %o3 ! Im Ergebnis Platz machen fuer naechste Stelle
or %o3, 1, %o3 ! Im Ergebnis rechts eine 1 vermerken
xor %l2, %l4, %l2 ! "neuer Divident" = alter Divident xor Divisor
passt_nicht:
subcc %l6, 1, %l6 ! Zaehler runterzaehlen
bne,a xorschleife ! und weiterrechnen, falls noch nicht fertig
sll %l2, 1, %l2 ! fuehrende Stelle im Dividenten rausschieben falls weiter
srl %l2, %l5, %o4 ! ansonsten Rest zurueckschieben (rechtsbuendig)
ausgeben:
call printf
nop
ret
restore
no_leading_zeroes:
mov %g0, %l1
cmp %l0, %g0
bneg no_more_zeroes
nop
zeroes_loop:
sll %l0, 1, %l0
cmp %l0, %g0
bpos zeroes_loop
add %l1, 1, %l1
no_more_zeroes:
retl
nop
.section ".data"
printf_text: .asciz "%016x : %016x = %016x, R %016x\n"
ach, da werd ich so müde vom lesen [img]
http://www.sternenvolk.de/symb/16.gif[/img],
.
.
gähn
.
.
merk: nie mehr nachts mit t anfangen ;)
gut nacht allerseits
ach, da werd ich so müde vom lesen [img]http://www.sternenvolk.de/symb/16.gif[/img],
.
.
gähn
Ich steig da schon selbst nicht mehr so richtig durch, ist ja auch schon ein paar Tage her, dass wir das geschrieben haben. Dem "gaehn" kann ich mich nur anschliessen [img]
http://www.sternenvolk.de/symb/7.gif[/img]