www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schiebeoperation negative Zahl


Autor: Christan K. (rumpi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine negative Zahl kannst du so nicht durch 2 teilen, denn da wird in 
die falsche Richtung gerundet...  :-o

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nimm ASRA.

MfG Spess

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christan K. (rumpi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre vielleicht eine Lösung die Zahl doppelt zu negieren?

Also so:

-negative Zahl negieren
-Schiebeoperation
-positive Zahl negieren

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Rundungsfehler ist meistens zu verschmerzen.

Aber das logische Schieben ist falsch.
Man muß das arithmetische Schieben benutzen.


Peter

Autor: Kai S. (zigzeg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kenne jetzt Deine CPU nicht, aber z.B. der 8051 hat kein arithmetisches 
Schieben. Da kopiert man erst das MSB ins Carry und rotiert:
  mov c, acc.7
  rrc a


Peter

Autor: Christan K. (rumpi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christan K. schrieb:
> -Multiplikation durchführen
> -positives Ergebnis negieren (Produkt ist negativ)
Und dazwischen kontrollieren, ob es einen Überlauf gegeben hat....

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christan K. (rumpi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> steht dann -32 also 20h in WERT?
Das wäre falsch, denn 20h != -32
Sondern  20h = +32

Autor: Christan K. (rumpi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie bekomme ich dann -32 raus? wüsste sonst nicht wie

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>und wie bekomme ich dann -32 raus? wüsste sonst nicht wie

Du bekommst ja nicht 20h heraus, sondern E0h (=-32).

MfG Spess

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christan K. (rumpi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
könntest du mir das bitte erklären?

Autor: BVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Der Rundungsfehler ist meistens zu verschmerzen.

Dann bekommt man: -1 / 2 => -1
:-)

Autor: Christan K. (rumpi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christan K. (rumpi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.