Hallo, ich hätte da mal eine Frage. ich möchte mit meinem µController (MC68HC11) einen negativen Wert durch 2 teilen. Also lade ich mir z.b. -128 in den Akku A (1000 0000 entpricht $80) Die Teilung möchte ich mit einer Schiebeoperation realisieren (logisches rechts schieben) Und am Ende natürlich das Ergebnis speichern auf z.b Adresse $100 ldaa #$80 lsra staa $100 Meine Frage ist, würde auf Adresse $100 dann -64 stehen? Also mir geht es um das MSB das bei negativen und positiven Zahlen das Vorzeichen bildet. Und ich weiß jetzt nicht ob aus diesem Vorzeichen Bit nach der Schiebeoperation ein Bit für den Zahlenwert wird.
Eine negative Zahl kannst du so nicht durch 2 teilen, denn da wird in die falsche Richtung gerundet... :-o
Christan K. schrieb: > ldaa #$80 > lsra > staa $100 > > Meine Frage ist, würde auf Adresse $100 dann -64 stehen? 0x80 LSR => 0x40. 0x80 ASR => 0xC0.
Wäre vielleicht eine Lösung die Zahl doppelt zu negieren? Also so: -negative Zahl negieren -Schiebeoperation -positive Zahl negieren
Der Rundungsfehler ist meistens zu verschmerzen. Aber das logische Schieben ist falsch. Man muß das arithmetische Schieben benutzen. Peter
Christan K. schrieb: > Die Teilung möchte ich mit einer Schiebeoperation realisieren (logisches > rechts schieben) Aus genau diesem Grund gibt es eigentlich immer 2 nach-Rechts-Schiebeoperationen: eine logische, und eine arithmetische. Was Du suchst ist arithmetisches nach-rechts-schieben. (dabei wird das Vorzeichenbit "kopiert"). Kenne den Instructionset vom 68HC11 nicht auswending, deshalb weiss ich nicht wie die Instruktion heisst. Vielleicht "asra" ??? Zum Links-schieben gibt es logischerweise nur eine Operation.
Kenne jetzt Deine CPU nicht, aber z.B. der 8051 hat kein arithmetisches Schieben. Da kopiert man erst das MSB ins Carry und rotiert:
1 | mov c, acc.7 |
2 | rrc a |
Peter
Hallo, Danke für die schnellen Antworten. 2 Fragen hätte ich jedoch. 1) Kann ich das arithmetische Schieben auch bei positiven Zahlen Verweden? Würde jetzt Denken ja, weil in dem Fall ja das MSB (0) kopiert wird. 2) ich möchte dann noch zu einer negativen Zahl ein Wert multiplizieren. Für die Multiplikation gibt es nur den Befehl "Mul" und welcher die Zahlen in Akku A & B multipliziert. Leider steht in meiner Beschreibung zu den Befehl, das dieser Befehl vorzeichen los ist. Wie sollte ich damit umgehen? Also vielleicht könnte hier meine Idee helfen -negative Zahl negieren (Zahl ist positiv) -Multiplikation durchführen -positives Ergebnis negieren (Produkt ist negativ)
Christan K. schrieb: > -Multiplikation durchführen > -positives Ergebnis negieren (Produkt ist negativ) Und dazwischen kontrollieren, ob es einen Überlauf gegeben hat....
Christan K. schrieb: > 1) Kann ich das arithmetische Schieben auch bei positiven Zahlen > Verweden? Ja, natürlich. > Wie sollte ich damit umgehen? Also vielleicht könnte hier meine Idee > helfen Kommt drauf an, ob du die obere Hälfte vom Produkt benötigst. Die untere Hälfte ist unabhängig von der Vorzeicheneingenschaft der Operanden.
Also wenn mein Programm z.b. folgende Befehle ausführt, steht dann am Ende -32 also 20h in WERT? ldx #$80 ;lade in Indexregister X den Wert -128 (80h) stx Wert ;speichere $80 in Wert asr Wert ;Division durch 2 asr Wert ;Division durch 2
> steht dann -32 also 20h in WERT?
Das wäre falsch, denn 20h != -32
Sondern 20h = +32
Hi
>und wie bekomme ich dann -32 raus? wüsste sonst nicht wie
Du bekommst ja nicht 20h heraus, sondern E0h (=-32).
MfG Spess
Christan K. schrieb: > und wie bekomme ich dann -32 raus? -128 (signed) = 10000000 = +128 (unsigned) Und wenn du jetzt falsch schiebst (und mit Nullen statt mit Einsen auffüllst), dann kommt statt -32 = 11100000 der Wert 32 = 00100000 heraus.
Peter Dannegger schrieb: > Der Rundungsfehler ist meistens zu verschmerzen. Dann bekommt man: -1 / 2 => -1 :-)
Hallo, Ok das hab ich nun begriffen. Könnte mir jemand mit meinem 2ten Problem helfen? Also wie kann ich Zahlen multiplizieren (wenn eine z.b. negativ ist) wenn der einzige Assemblerbefehl (mul) vorzeichenlos ist? Viele Grüße und Danke schonmal für die Antworten bei der Schiebeoperation.
Hätte noch jemand vielleicht eine Idee mit der Multiplikation? Also könnte man von einer negativen Zahl das Zweierkomplement bilden (dann positiv), dann multiplizieren und dann wieder das Zweierkomplement bilden um das negative Produkt zu erhalten?
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.