Hey, ich hab da mal eine blöde Frage. Ist es so, das fmul, fmuls und fmulsu auf die gleiche "Funktion" arbeiten. Also, ich meine immer das selbe Ergebnis liefern und nur einen dokumentarischen Charakter haben, oder gibt es irgendwelche Fälle wo sich diese Funktionen unterscheiden. Denn so weit wie ich das bisher gesehen habe befindet sich ja die Festkommastelle immer zwischen dem 6ten und dem 7ten Bit. Danke schon mal. Sep
Da hilft vermutlich die Beschreibung des Instruction Sets des (unbekannten) Prozessors weiter.
Oh sry, ich mein allgemein das AVR Instruction Set Dokument. Also, Dort sind ja alle ATmegas und so mit enthalten. Bei mir speziell ist es der ATmega88P. Aber mal rein logisch. Es werden keine Vorzeichenbits bei dem fmul(s/su) Befehlen benötigt. Weiterhin ist es ja bsp so das: 0,125 * 0,5 = -0,125 * -0,5 = | 0,125 * -0,5 | usw usf. Oder stehe ich da irgendwie gerade auf dem Schlauch?
Wenn ich das richtig sehe, haben FMULS und FMULSU denselben Code (0000 0011 1ddd 1rrr). Damit scheinen sie ziemlich gleich zu sein. Zu FMUL:
1 | ... |
2 | Eine Multiplikation zweier Zahlen im Format N1.Q1 und N2.Q2 |
3 | ergibt ein Ergebnis im Format (N1+N2).(Q1+Q2). N bedeutet dabei |
4 | die Anzahl der binären Stellen links vom Dezimalpunkt, Q bedeutet |
5 | die Anzahl der binären Stellen rechts vom Dezimalpunkt. |
6 | In Mikrocontroller-Anwendungen liegt der Input oft im Format 1.7, |
7 | womit sich ein Ergebnis im Format 2.14 ergibt. Ein Linksschieben |
8 | des Ergebnisses ermöglicht, dass das High- Byte des Ergebnisses |
9 | im gleichen Format wie der Input vorliegt. |
10 | Das 1.7 Format wird für gewöhnlich bei vorzeichenbehafteten Zahlen |
11 | verwendet, während FMUL eine Multiplikation vorzeichenloser Zahlen |
12 | durchführt. Daher wird FMUL für eine Teilmultiplikation von 16 Bit - |
13 | Zahlen im 1.15 Format verwendet, wenn ein Ergebnis im 1.31 Format |
14 | benötigt wird. Das Ergebnis der FMUL-Operation kann an einem |
15 | Zweierkomplement-Überlauf leiden, wenn das Ergebnis als eine Zahl |
16 | im 1.15 Format interpretiert wird. Das MSB des Ergebnisses vor dem |
17 | Linksschieben wird in das Carry-Flag gesichert. |
18 | Dieser Befehl ist nicht in allen Bausteinen verfügbar. Als |
19 | Operanden stehen nur die Register R16 bis R23 zur Verfügung. |
Aus: http://www.avr-roboter.de/controller/befehle/uebersicht/uebersicht.html
Klaus Wachtler schrieb: > Wenn ich das richtig sehe, haben FMULS und FMULSU denselben Code (0000 > 0011 1ddd 1rrr). > Damit scheinen sie ziemlich gleich zu sein. http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf
1 | FMULSU 0000 0011 1ddd 1rrr |
2 | FMULS 0000 0011 1ddd 0rrr |
3 | FMUL 0000 0011 0ddd 1rrr |
4 | ^ ^ |
naja. Aber wie ist denn das mathematisch... (+/-) a * (+/-) b = |a|*|b| Oder etwa nicht? Da denn also die Vorzeichen ja nicht mit übergeben werden (also im MSB) und die Form der Zahlen ja immer gleich ist, denke ich das es sich nur um einen dokumentarischen Charakter handelt. Also, es erfolgt trotz unterschiedlichem Opcode die gleiche Schaltung... Ich weiß nu nicht, wie ich das anders ausdrücken soll...
Arc Net schrieb: > Klaus Wachtler schrieb: >> Wenn ich das richtig sehe, haben FMULS und FMULSU denselben Code (0000 >> 0011 1ddd 1rrr). >> Damit scheinen sie ziemlich gleich zu sein. > > http://www.atmel.com/dyn/resources/prod_documents/...FMULSU 0000 0011 1ddd 1rrr > FMULS 0000 0011 1ddd 0rrr > FMUL 0000 0011 0ddd 1rrr > ^ ^ ups... Sorry & Danke!
sep schrieb: > Da denn also die Vorzeichen ja nicht mit übergeben > werden (also im MSB) ? Wie kommst du darauf?
sep schrieb: > Da denn also die Vorzeichen ja nicht mit übergeben werden Manual Not Read Error. 0x80 = -1.0. Die Vorkommastelle ist bei Operanden mit Vorzeichen gleichzeitig auch das Vorzeichen.
Klaus Wachtler schrieb: > sep schrieb: >> Da denn also die Vorzeichen ja nicht mit übergeben >> werden (also im MSB) > > ? > Wie kommst du darauf? Naja, wenn man sich die Doc anschaut von den Befehlen, dann ist es so dass alle eine 1.7 Struktur besitzen. Also Bit 7 gibt an ob die Zahl gößer als 1 ist. (Also 2^0) Bit 6 ist 2^(-1) Bit 5 ist 2^(-2) usw. Diese Struktur ist bei allen gleich. Ich sehe in der doc nichts von Vorzeichen. D.h. Die Struktur ist gleich nur die Opcodes unterscheiden sich. Oder ich habe die Befehle FMUL, FMULS und FMULSU ein bisschen falsch verstanden.
A. K. schrieb: > 0x80 = -1.0. Die Vorkommastelle ist bei Operanden mit Vorzeichen > gleichzeitig auch das Vorzeichen. genauso ist 0x80 bei FMUL = 1 und 0x40 ist bei FMUL 0.5 bzw bei FMULS -0.5 Die Struktur der Zahlen ist doch somit gleich. Nur das die verschieden interpretiert werden...
sep schrieb: > Die Struktur der Zahlen ist doch somit gleich. Nur das die verschieden > interpretiert werden... Eben, und genau das macht den Unterschied aus. Wir sind es zwar gewohnt, dass Addition und Subtraktion sich nicht dafür interessieren, ob die Operanden mit oder ohne Vorzeichen gemeint sind (*). Aber bei der Multiplikation NxN => 2N trifft das nicht zu. Nur die untere Hälfte vom Ergebnis ist nicht von der Vorzeicheninterpretation abhängig, die obere hingegen schon. Zieh das mal von Hand für 8x8=>16 Bits durch, indem du beide Operanden auf 16 Bits entsprechend vorzeichenerweiterst und dann rechnest. Die FMUL (1,7)x(1,7) => (1,15) Befehle unterscheiden sich nur durch die abschliessende Schiebeoperation von den MUL 8x8 => 16 Befehlen. *: Für das 9. Bit trifft das auch hier nicht mehr zu. Das gibts deshalb zweimal, als Carry und als Overflow.
naja. Aber sie werden ja nicht bei der Auswertung des Befehls anders interpretiert. Denn, es ist ja egal, ob ich -a oder a mit -b oder b multipliziere. Im Betrag kommt immer das selbe raus. Da das Vorzeichen ja nicht mit übergeben wird, sondern nur am Befehl hängt und man sich ja denken kann das zwei negative Zahlen multipliziert wieder eine positive ergeben, oder zwei positive Zahlen ja auch wieder eine positive Zahl ergeben, oder aber eine positive und eine negative Zahl eine negative ergeben, kann doch immer nur via einem Befehl gerechnet werden... Also, ob ich nun: > 1.5 * 0.5 = 0.75 > -1.5 * -0.5 = 0.75 > -1.5 * 0.5 = -0.75 rechne. Das Ergebnis ist doch im Betrag immer das gleiche. Die einzelnen Befehle geben als Bitmuster auch das Gleiche aus. (Bei gleicher Eingabe) Also, die Interpretation obliegt doch dem Programmierer. Also könnte man doch bei allen drei Fällen jeweils nur auf das FMUL zurück greifen.
sep schrieb: > Da das Vorzeichen > ja nicht mit übergeben wird, sondern nur am Befehl hängt Wir sind hier in der Technik, nicht in der Politik, d.h. der Satz wird durch ständige Wiederholung nicht richtiger. ;-) 0x40 ist positiv, egal ob FMUL oder FMULS. 0xC0 ist bei FMUL positiv, bei FMULS negativ.
A. K. schrieb: > Wir sind hier in der Technik, nicht in der Politik, d.h. der Satz wird > durch ständige Wiederholung nicht richtiger. ;-) Jo, stimmt wohl. :D Aber ich habe doch bei gleichen Bitmustern in den Registern Rd und Rr bei FMUL, FMULS und FMULSU das gleiche Bitmusster als Ergebnis in R0:R1, oder ist das nicht so? Wenn nicht, dann würd ich gerne mal ein Gegenbeispiel haben. ^^
Hatte ich grad geliefert. Vorsicht Falle: Die Festkommadarstellung ist nicht Sign-Magnitude wie bei Fliesskommadarstellung, sondern weiterhin Zweierkomplement, also 0x80 (-1.0) < 0x81 < 0x82 ... < 0xFF < 0x00 ... < 0x7F (fast 1.0)
Jop, hatte ich gerade ein bisschen überlesen, bzw vorschnell geantwortet. Danke nochmal der Erklärung. Dann muss ich noch mal ein bisschen experimentieren und vielleicht gehts dann auch in den Geist über! ^^
Offen gesagt bin ich bei der Interpretation der Zahlenformate und der Befehle auch unsicher. Wäre vielleicht einer so nett, das mit ein bisschen Systematik mal für Dummies zu beschreiben? Ich weiss nicht ob das Schema passt, aber ich stelle mir das ungefähr so vor. 1.Operand 2.Operand FMUL FMULS FMULSU 0x00 0x00 0*0=0x0000 0x00 0x0F 0x00 0x80 0x00 0x8F 0x0F 0x00 0x0F 0x0F 0x0F 0x80 0x0F 0x8F 0x80 0x00 -1* 0x80 0x0F -1* 0x80 0x80 -1*-1=0x0001? 0x80 0x8F -1* 0x8F 0x00 0x8F 0x0F 0x8F 0x80 0x8F 0x8F
sep schrieb: > dann würd ich gerne mal ein Gegenbeispiel haben. Mit MUL,MULS: MUL: 0x81*0x81 = 0x0081*0x0081 = 0x4101 MULS: 0x81*0x81 = 0xFF81*0xFF81 = 0x3F01 Bei FMULx kommt nur die Anpassung (2,14) => (1,15) hinzu.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.