Forum: Mikrocontroller und Digitale Elektronik Schiebeoperation negative Zahl


von Christan K. (rumpi)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Nimm ASRA.

MfG Spess

von (prx) A. K. (prx)


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.

von Christan K. (rumpi)


Lesenswert?

Wäre vielleicht eine Lösung die Zahl doppelt zu negieren?

Also so:

-negative Zahl negieren
-Schiebeoperation
-positive Zahl negieren

von Peter D. (peda)


Lesenswert?

Der Rundungsfehler ist meistens zu verschmerzen.

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


Peter

von Kai S. (zigzeg)


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.

von Peter D. (peda)


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:
1
  mov c, acc.7
2
  rrc a


Peter

von Christan K. (rumpi)


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)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von (prx) A. K. (prx)


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.

von Christan K. (rumpi)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Christan K. (rumpi)


Lesenswert?

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

von spess53 (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Christan K. (rumpi)


Lesenswert?

könntest du mir das bitte erklären?

von BVR (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Der Rundungsfehler ist meistens zu verschmerzen.

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

von Christan K. (rumpi)


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.

von Christan K. (rumpi)


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?

von (prx) A. K. (prx)


Lesenswert?

Ja.

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
Noch kein Account? Hier anmelden.