Ahoi,
koennte jemand sich kurz die Muehe machen und in wenigen Saetzen grob umreissen, wie die Tabelleneintrage zustande kommen? Was ist das x?
Edit: ach so, muss man einfach nur durch das Polynom 10011 teilen?
Edit: Labskaus hat mir erklaert, dass es wohl auf (Zeile*Spalte):(10011) rauslaeuft, wobei ":" die Polynomdivision mit diesem XOR statt ADD ist.
letzteres is richtig.
Es waere allerdings nochmal ganz hilfreich,
wenn hier nochmal die Musterloesung zu Aufgabenblatt 7 praesentiert wuerde.
letzteres is richtig.
Es waere allerdings nochmal ganz hilfreich,
wenn hier nochmal die Musterloesung zu Aufgabenblatt 7 praesentiert wuerde.
Wo kriegt man die Musterloesungen denn her?
Es gibt keine. Meinte unser Übungsgruppenleiter noch am Montag.
Aber wir haben es doch gut hingekriegt, oder?
Für die anderen siehe auch anderes Topic.
[…]wenn hier nochmal die Musterloesung zu Aufgabenblatt 7 praesentiert wuerde
Es gibt keine.
Super, wie soll man die dann hier posten? [img]
http://www.sternenvolk.de/symb/7.gif[/img]
Aber wir haben es doch gut hingekriegt, oder?
Für die anderen siehe auch anderes Topic.
Es schien zu laufen.
Edit: Labskaus hat mir erklaert, dass es wohl auf (Zeile*Spalte):(10011) rauslaeuft, wobei ":" die Polynomdivision mit diesem XOR statt ADD ist.
wobei die multiplikation auch mit xor von statten geht,
wenn ich mich nicht stark irre,
und von der divison interessiert der rest, nicht das ergebnis
beispiele:
3*3
->
11 * 11
-------
11
xor 11
-------
101
101 : 10011 = 0 R 101
.
.
.
.
f * 3
->
1111 * 11
---------
1111
xor 1111
---------
10001
10001 : 10011 = 1 R 10
10011
-----
10
'musterlösung' zu 7 hier:
http://3773.rapidforum.com/topic=101886114502&search=&reverse=1?
10001 : 10011 = 1 R 10
10011
—–
10
Wie kommst du denn auf 1 R 10?
Also, Dezimal geschrieben:
17 : 19 = 1 Rest 2 ?????
10001 ist doch kleiner als 10011, also kann doch gar nicht 1,xxx rauskommen.
Oder blicke ich da was nicht?
Es geht nicht darum, ob der Divisor kleiner ist als der Divident, sondern, ob die den gleichen Grad haben. Wir rechnen hier ja nicht wirklich im Körper der reelen Zahlen, sondern……in einem anderen Körper :-)
Daher auch z.B. XOR statt +.
Wie kommst du denn auf 1 R 10?
Also, Dezimal geschrieben:
17 : 19 = 1 Rest 2 ?????
10001 ist doch kleiner als 10011, also kann doch gar nicht 1,xxx rauskommen.
Oder blicke ich da was nicht?
jo wie schon erwähnt, hier gibts kein plus/ minus sondern nur xor,
das sieht dann so aus:
10001 : 10011 = 1 R 10
xor 10011
-----
10
10 ist (vom grad her) kleiner als divisor also ende
vergleiche auch addition:
3+7
11
xor 111
-------
100 = 4
Hat schon jemand die Tabelle fertig zum Vergleichen?
Das ist meine:
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 2 3 4 5 6 7 8 9 a b c d e f
2 0 2 4 6 8 a c e 3 1 7 5 b 9 f d
3 0 3 6 5 c f a 9 b 8 d e 7 4 1 2
4 0 4 8 c 3 7 b f 6 2 e a 5 1 d 9
5 0 5 a f 7 2 d 8 e b 4 1 9 c 3 6
6 0 6 c a b d 7 1 5 3 9 f e 8 2 4
7 0 7 e 9 f 8 1 6 d a 3 4 2 5 c b
8 0 8 3 b 6 e 5 d c 4 f 7 a 2 9 1
9 0 9 1 8 2 b 3 a 4 d 5 c 6 f 7 e
a 0 a 7 d e 4 9 3 f 5 8 2 1 b 6 c
b 0 b 5 e a 1 f 4 7 c 2 9 d 6 8 3
c 0 c b 7 5 9 e 2 a 6 1 d f 3 4 8
d 0 d 9 4 1 c 8 5 2 f b 6 3 e a 7
e 0 e f 1 d 3 2 c 9 7 6 8 4 a b 5
f 0 f d 2 9 6 4 b 1 e c 3 8 7 5 a
http://www.informatik.uni-hamburg.de/TKRN/world/abro/T3/t3k4w01.pdfDa findest du auf Seite Folie 19 die richtige Lösung, hab gerade keinen Bock, das mit deiner zu vergleichen [img]
http://www.sternenvolk.de/symb/25.gif[/img] Macht aber 'n vernünftigen Eindruck
dein Program dazu wäre allerdings viel interessanter.. Meine Polynommultiplikatin errechnet immer ein Ergebnis von 0 - unabhängig von der Eingabe… [img]
http://www.sternenvolk.de/symb/22.gif[/img]
Dass du das vergleichst wollte ich nicht verlangen. :p
Mir fehlte auch nur die richtige Seite mit der Lösung. Kommt aber auf jeden Fall hin.
Nun zum Programm:
!%l0 f1
!%l1 f2
!%l2 f2grad
!%l3 ergebnis
!%l4 0x80000000
!%l5 zwischenergebnisse
mov %i0,%l0
mov %i1,%l1
mov 31,%l2
mov %g0,%l3
sethi %hi(0x80000000),%l4
.schleife:
andcc %l1,%l4,%l5
bnz .nach_schleife
nop
cmp %g0,%l2
bg .rueckgabe
nop
sll %l1,1,%l1
dec %l2
ba .schleife
nop
.nach_schleife:
sll %l0,%l2,%l5
xor %l3,%l5,%l3
sll %l1,1,%l1
dec %l2
ba .schleife
nop
.rueckgabe:
mov %l3,%i0
jmp %i7+8
restore
Hmm… mir scheint, ich habe mir das echt zu kompliziert gemacht.. über 100 Zeilen, und es funktioniert noch nicht mal..
Mal sehen, ob ich durch deines durch steige [img]
http://www.sternenvolk.de/symb/25.gif[/img]
100 Zeilen?? [img]
http://www.sternenvolk.de/symb/18.gif[/img]
Eigentlich nimmt man sich nur einen Faktor, shiftet den bis man vorne ne 1 hat. Dabei zählt man immer den Grad mit und shiftet den anderen Faktor um eben diesen Grad, macht damit xor mit dem bisherigen Ergebnis, shiftet noch mal und fängt wieder vorne an.
man kanns auf die aufgabe bezogen auch bisschen einfacher bauen,
also nur schauen ob das 1., 2., 3. oder 4. bit des einen faktoren gesetzt ist, und dann jeweils den anderen faktor xor-addieren (so wie mans in der schule lernt),
macht jetzt aber auch keinen grossen unterschied.. [img]
http://www.sternenvolk.de/symb/22.gif[/img]
100 Zeilen?? [img]http://www.sternenvolk.de/symb/18.gif[/img]
Eigentlich nimmt man sich nur einen Faktor, shiftet den bis man vorne ne 1 hat. Dabei zählt man immer den Grad mit und shiftet den anderen Faktor um eben diesen Grad, macht damit xor mit dem bisherigen Ergebnis, shiftet noch mal und fängt wieder vorne an.
Den Shift Kram brauchst Du im Grunde genommen [tm] nicht. Die Polynom-Multiplikation bekommt man mit 11 Zeilen Code und einem bedingten Sprung (fuer die Schleife) hin, da bin ich mir auch ziemlich sicher, dass es nicht mehr kompakter geht.
Bei der Polynom-Division bin ich bisher auf 18 Befehle (davon 1 NOP und drei bedingte Spruenge) gekommen, das geht aber bestimmt noch besser.
Wann ist eigentlich die Deadline zum Abgeben?
.schleife:
andcc %l1,%l4,%l5
bnz .nach_schleife
%l5 benutzt Du dann weiter gar nicht, oder? Dann kannst Du dir auch %l4 sparen und schreiben
.schleife:
cmp %l1, %g0
bpos .nach_schleife
sll %l1,1,%l1
dec %l2
ba .schleife
nop
Hier wuerde ich den delay slot besser ausnutzen
dec %l2
ba .schleife
sll %l1,1,%l1
.nach_schleife:
sll %l0,%l2,%l5
xor %l3,%l5,%l3
sll %l1,1,%l1
dec %l2
ba .schleife
nop
Ebenso hier
.nach_schleife:
sll %l0,%l2,%l5
xor %l3,%l5,%l3
dec %l2
ba .schleife
sll %l1,1,%l1
Wann ist eigentlich die Deadline zum Abgeben?
zitat vom aufgabenzettel:
"Abgabetermin: 5. Januar 2003"
das ist der sonntag..
Es gibt auch Gruppen, die das auf den 6ten "rausgeboxt" haben. [img]
http://www.sternenvolk.de/symb/15.gif[/img]
.schleife:
andcc %l1,%l4,%l5
bnz .nach_schleife
%l5 benutzt Du dann weiter gar nicht, oder? Dann kannst Du dir auch %l4 sparen und schreiben
.schleife:
cmp %l1, %g0
bpos .nach_schleife
Eben getestet und gewundert, warum es nicht mehr geht… Mit bl statt bpos gehts dann.
Ein paar Befehle eingespart, aber bis zu deinen 11 Zeilen ist noch ein weiter Weg.
bpos .nach_schleife
Eben getestet und gewundert, warum es nicht mehr geht… Mit bl statt bpos gehts dann.
Argh, es muss ja auch bneg heissen. Das bedeutet, es wird gesprungen, sofern das oberste Bit gesetzt ist.
HELP!!!
Ich verzweifle gerade.
srl %i0, 3, %l5
umul %l5, %i1, %l1
sll %l1, 3, %l1
! liefert (erste stelle von Polynom1) mal P2 << 3
and %i0, 4, %l5
srl %l5, 2, %l5
umul %i5, %i1, %l2
! sll %l2, 2, %l2
! AUSGABE erfolgt hier
Eigentlich soll dieser kram mit dem and die richtige stelle raussuchen, nach ganz rechts schieben, danach erfolgt die multiplikation mit dem anderen polynom. Das shiften hab ich zum testen mal rausgenommen. Und während das ganze bei dem ersten noch prima klappt, erhalte ich bei dem zweiten folgendes:
Beispiel: f*f
L1 = 120 (dezimal, richtig) (binär: 1111000)
i0 = 15 ein Polynom
i1 = 15 anderes Polynom
L5 = 1
L2 = 4084333216 (dezimal, falsch, es müsste 15 sein)
Wie kommt dieses komische Ergebnis bei L2 zustande? bei mir ist 1*15 immernoch 15. schnief
Ha.. erster Fhler gefunden.. es muss natürlich immer L5 und nicht i5 heißen [img]
http://www.sternenvolk.de/symb/22.gif[/img]
Hmm.. wenigstens weiß ich jetzt, dass ich mit dem Ansatz totalen Unsinn mache, der sich leichter lösen lässt. Ich glaube, das wirkliche Problem ligt in der Division [img]
http://www.sternenvolk.de/symb/22.gif[/img]
Kann mal jemand die richtigen Ergebnisse der Multiplikatin OHNE PolynomDivision posten? Damit ich wenigstens weiß, ob diese Annahme richtig ist? Bei mir sieht das jetzt so aus:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 2 4 6 8 a c e 10 12 14 16 18 1a 1c 1e
0 3 6 5 c f a 9 18 1b 1e 1d 14 17 12 11
0 4 8 c 10 14 18 1c 20 24 28 2c 30 34 38 3c
0 5 a f 14 11 1e 1b 28 2d 22 27 3c 39 36 33
0 6 c a 18 1e 14 12 30 36 3c 3a 28 2e 24 22
0 7 e 9 1c 1b 12 15 38 3f 36 31 24 23 2a 2d
0 8 10 18 20 28 30 38 40 48 50 58 60 68 70 78
0 9 12 1b 24 2d 36 3f 48 41 5a 53 6c 65 7e 77
0 a 14 1e 28 22 3c 36 50 5a 44 4e 78 72 6c 66
0 b 16 1d 2c 27 3a 31 58 53 4e 45 74 7f 62 69
0 c 18 14 30 3c 28 24 60 6c 78 74 50 5c 48 44
0 d 1a 17 34 39 2e 23 68 65 72 7f 5c 51 46 4b
0 e 1c 12 38 36 24 2a 70 7e 6c 62 48 46 54 5a
0 f 1e 11 3c 33 22 2d 78 77 66 69 44 4b 5a 55
Ich danke auch [img]
http://www.sternenvolk.de/symb/25.gif[/img]
Manchmal kommt man erst darauf, wenn man es anderen erzählt.
Wie bekomme ich unter Unix eine ausfuehrbare Datei zum laufen???
Ich habe mir ein Assemblerprogramm geschrieben und ein kleines
C-Programm dazu. Diese habe ich mit "cc -o …."
zusammengefuehrt.
Jetzt bekomme ich aber diese verdammte Datei einfach nicht zum
Laufen[img]
http://www.fb18.de/gfx/20.gif[/img]
Mit -o gibst Du den Namen der ausführbaren Datei an. Das was Du danach geschrieben hast, musst Du dann auch im Entsprechenden Verzeichnis eingeben. Lass sonst einfach das -o und den Namen weg, dann legt der Compiler eine Datei namens a.out an. Die ist dann auch wieder ausführbar.
Tip:
Es sei gegeben:
cc -o foo …..
Je nach shell-einstellung kann es nötig sein, anstatt einfach
foo
einzugeben um zu starten,
./foo
einzugeben. [img]
http://www.fb18.de/gfx/28.gif[/img]
Und hier was neues aus der Serie"Hilfe, ich werde verrückt!":
Obwohl mir klar ist, daß man sicherlich auch sehr viel kürzeren Code schreiben kann (wenn man denn könnte…), wollte ich dennoch mein "Baby" zum laufen bringen. Ich wär euch sehr verbunden, wenn ihr mir sagen könntet, woran es hapert.
.global division
division:
save %sp,-112,%sp
st %i0,[%fp+68]
! i0:Dividend(max32Bit)
! i1:Divisor(max16Bit)
! i2:höchstwertiges Bit ungleich 0 des Dividenden
! i3:höchstwertiges Bit ungleich 0 des Divisors
! o3:Ergebnis der Polynomdivision
! o4:Rest
! l0:0x80000000
! l2:Temp
!Für spätere Ausgabe Dividend und Divisor schonmal in %o1/%o2 !schreiben und damit sichern
mov %i0, %o1
mov %i1, %o2
!Abbruch, wenn Dividend oder Divisor gleich 0 sind
cmp %i0, 0
be .fertig
cmp %i1, 0
be .fertig
sethi %hi(0x80000000), %l0
set 33, %i2
set 17, %i3
!Dividend solange links-shiften, bis erste 1 in höchstem Bit
!dabei den Grad entsprechend dekrementieren
.grad_dividend:
sub %i2, 1, %i2
andcc %i0, %l0, %g0
bne .grad_divisor
nop
ba .grad_dividend
sll %i0, 1, %i0
!Divisor solange linkshiften, bis erste 1 in höchstem Bit
.grad_divisor:
sub %i3, 1, %i3
andcc %i1, %l0, %g0
bne .rechne
nop
ba .grad_divisor
sll %i1, 1, %i1
.rechne:
cmp %i2, %i3
bneg .ganz_fertig !wenn Grad des Divisors>Grad
!des Dividenden
nop
sll %o3, 1, %o3 !Ergebnis linksshiften (Merke:
!hinten kommt ne Null dran!)
andcc %i0, %l0, %g0 !Prüft, ob Dividend eine
!führende 1 hat
bne .schreibe1 !falls ja, bekommt Ergebnis
!eine 1, sonst bleibt 0
nop
.rechne_fertig:
sll %i0, 1, %i0 !Dividend linksshiften
sub %i2, 1, %i2 !Grad anpaßen
ba .rechne
nop
.ganz_fertig:
or 32, %g0, %l2
sub %l2, %i2, %l2 !sooft muß wieder
!rechtsgeshiftet werden
srl %i0, %l2, %i0 !Rest wieder rechts-ausrichten
!vielleicht mit sra??
.fertig:
set .text, %o0 !Ausgabe zum Testen
call printf
mov %i0, %o4 !was vom Dividenden blieb ist
!der Rest
mov %o3, %i0 !Zurückschreiben und fertig
mov %o4, %i1
jmp %i7+8
restore
.schreibe1:
or %o3, 0x00000001, %o3 !Ergebnis bekommt
!hinten eine 1
xor %i0, %i1, %i0 !Divisor vom
!"runtergeholtem" abziehen
ba .rechne_fertig
nop
.text:
.asciz " %x durch %x ergibt %x mit Rest %x\n."
Danke im vorraus![img]
http://www.fb18.de/gfx/23.gif[/img]
was mir so auffiel:
1.
o3 müsste irgendwo mal einen anfangswert von 0 bekommen..
2.
grad des divisors sollte am anfang auch 33 sein,
wieso 17, wenn du genauso bis zum 32. bit nach links schiebst?
3.
nops-sparerei kann etwas gefährlich sein,
(gerade wenn man noch in der testversion ist
und nicht weiss wo der fehler liegt!!)
am anfang bei
cmp %i0, 0
be .fertig
cmp %i1, 0
be .fertig
würd ich's mal mit nops zwischendurch versuchen
ob sonst vom algorithmus her korrekt ist, kann ich nicht beschwören,
schreib mal paar beispiele mit ausgabe, wenns immer noch nicht läuft
im topic zu blatt 6 gibts 2 funktionierende varianten,
http://3773.rapidforum.com/topic=101886114502
o3 müsste irgendwo mal einen anfangswert von 0 bekommen..
Sowas habe ich schon befürchtet; also kann ich nicht davon ausgehen, daß alle Register von vorherein auf 0 gesetzt sind??
grad des divisors sollte am anfang auch 33 sein,
wieso 17, wenn du genauso bis zum 32. bit nach links schiebst?
Stimmt! Ich kam mit dem "Divisor brauch nur 16bit" durcheinander…
schreib mal paar beispiele mit ausgabe, wenns immer noch nicht läuft
mach ich dann Sylvester, so gegen 2355 …[img]
http://www.fb18.de/gfx/6.gif[/img]
im topic zu blatt 6 gibts 2 funktionierende varianten,
http://3773.rapidforum.com/topic=101886114502
Hmm, hatte das Gefühl, das die teilweise auch nicht so ganz funktionieren, werde aber wohl "im Notfall" darauf zurückgreifen.
Danke erstmal!
#include <stdio.h>
#include <stdlib.h>
void polydiv(unsigned int, unsigned short);
int main(int argc,char *argv[]) {
unsigned int a,b;
if(argc < 3) {
fprintf(stderr, "%s: intarg shortarg\n", argv[img]http://images.rapidforum.com/images/i0.gif[/img]);
return 1;
}
a = abs(atoi(argv[ 1 ]));
b = abs(atoi(argv[ 2 ]));
polydiv(a,b);
return 0;
}
void polydiv(unsigned int a, unsigned short bb) {
unsigned int b = bb;
unsigned int quot; /* quotient */
int adeg, bdeg; /* degree of a and b */
for(adeg=31; ((a & 0x80000000) == 0) && (adeg > 0); --adeg)
a<<=1;
for(bdeg=31; ((b & 0x80000000) == 0) && (bdeg > 0); --bdeg)
b<<=1;
for(quot=0; adeg >= bdeg; --adeg) {
quot <<=1;
if(a & 0x80000000) {
a ^= b;
quot ^= 1;
}
a <<= 1;
}
a >>= 31 - adeg; /* rest */
printf("Quotient und Rest -> %08X , %08X\n", quot,a);
}
Das ist die Loesung unseres Gruppenleiters für Blatt7.
Kann das sein, das die nicht ganz korrekt ist?
Für polydiv(33,11) kommt nämlich folgendes raus:
Quotient = 5
Rest = 6
Bei den meisten Fällen stimmt es ja auch, aber nicht immer!!
Das ist doch shit!!!
im topic zu blatt 6 gibts 2 funktionierende varianten,
http://3773.rapidforum.com/topic=101886114502
Ich glaube das hat genau die selben Fehler…
Zumindest ist es nicht ganz korrekt!!!
Das ist die Loesung unseres Gruppenleiters für Blatt7.
Kann das sein, das die nicht ganz korrekt ist?
Für polydiv(33,11) kommt nämlich folgendes raus:
Quotient = 5
Rest = 6
Bei den meisten Fällen stimmt es ja auch, aber nicht immer!!
Das ist doch shit!!!
hmm, was ist das problem, das ist doch das richtige ergebnis [img]
http://www.fb18.de/gfx/24.gif[/img]
es ist ja ne POLYNOMDIVISION,
da kommt das halt raus
33 : 11
->
100001 : 1011 = 101 Rest 110, also 5 Rest 6
xor 1011
----
1101
xor 1011
----
110
Kann das sein, das die nicht ganz korrekt ist?
Für polydiv(33,11) kommt nämlich folgendes raus:
Quotient = 5
Rest = 6
Sowohl die Lösung vom Ü-Leiter, als auch die anderen Lösungen sind korrekt [img]
http://www.fb18.de/gfx/28.gif[/img] zum mitrechnen:
100001:1011=101
1011
----
1101
1011
----
110
Macht bei mir 33:11=5 Rest 6
Edit: Menno Slater, warum postest du auch zur selben Zeit wie ich [img]
http://www.fb18.de/gfx/28.gif[/img]
timemanagement..
edit
ob die dort zitierten korrekt sind sei mal dahingestellt,
aber es wurde noch kein fehler gefunden..
@Slater:
Danke, jetzt funktioniert alles!
Dann vergesst mal nicht abzugeben, morgen ist ja Deadline.