www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik was bedeuten diese befehle


Autor: fksystems (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe hier so etwas aus einem code:

ldi    all0, (1<<TOV0)

ldi    all0, -0xC3

frage:
was bedeutet: (1<<TOV0)
und: -0xC3

(also ich meine, was bedeutet das minux-zeichen da?)

weiß das jemand?

Autor: Thomas K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei 1<<TOV0 wird eine 1 einfach nach links geschoben. und das so oft wie
der Wert der für TOV0 steht.
wenn also TOV0 4 ist dann heißt das einfach 1<<4 also eine Eins viermal
nach links shiften.

Autor: Khani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Minus-Zeichen:

Manchmal will man das Zweierkomplement einer Zahl in ein Register laden
(zum Beispiel kann man das Zweierkomplement auch prima verwenden, um
mit einem einzigen Befehl eine Konstante zu einem Register
hinzuzuzählen - es gibt im AVR-Befehlssatz eben nur SUBI und nicht ADDI
;-))

Also lange Rede kurzer Sinn : Hier wird ein Register mit dem
Zweierkomplement von 0xC§ geladen (man kann es auch vorher ausrechnen
und hinschreiben, aber so ists übersichtlicher, finde ich auch)

Autor: fksystems (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm.. bei dem nach links schieben, was passiert dann da? wird der ganze
registerinhalt dann nach links geschoben? was passiert, wenn am ende
einsen oder nullen überstehen? gehen die verloren oder werden die auf
der rechten seite dann wieder reingeschoben?


und die sache mit dem komplement:
der wert C3 sei ja jetzt meinetwegen 195. aber in den registern des
controllers kann man doch nur werte bis 255 unterbringen. für das
komplement von 195 müßte dann doch das doppelte an platz wie für 255
haben, also der größte wert müßte dann doch 512 sein, was bei 8 bit
aber nicht geht.

wird dieser jemand, der diesen befehl hingeschrieben hat, dann
vielleicht mit diesem befehl ein 16bit register angesprochen haben oder
wie muß man das verstehen?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wird der ganze registerinhalt dann nach links geschoben?

Nein, nur die 1 wird verschoben, von Register ist zu diesem Zeitpunkt
noch keine Rede: das ganze ist ein arithmetischer Ausdruck innerhalb
des Assemblers.

> was passiert, wenn am ende einsen oder nullen überstehen?

Hau wech! :-)

> der wert C3 sei ja jetzt meinetwegen 195. aber in den registern des
> controllers kann man doch nur werte bis 255 unterbringen.

Ja, aber eine 255 ist in Zweierkomplementdarstellung die -1.  Das sind
zwei unterschiedliche Betrachtungsweisen für ein und dasselbe
Bitmuster, bei einer geht der Wertebereich von -128 bis +127
(vorzeichenbehaftete Dezimalzahl), bei der anderen von 0 bis 255.

OK, -0xc3 ist bißchen sinnig, da die Zahl natürlich schon größer ist
als +127, also eigentlich die Betrachtungsweise 0...255 wäre.
Dennoch, ein Zweierkomplement kann man rechnerisch davon bilden; es
ist definiert als die Negation des Bitmusters (auch Einerkomplement
genannt), zu der eine 1 addiert wird.  Überlauf wird wiederum im
vorliegenden Fall stillschweigend ignoriert:

 0xc3 = 0b11000011

Einerkomplement davon:
~0xc3 : 0b00111100
+1               1
macht:  0b00111101 = 0x3d

Autor: fksystems (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm.. heißt das dann, daß das für den controller nix anderes ist, als
wenn ìch da jetzt 3d hinschreiben würde oder halt 61 in dez.

oder erkennt der controller an irgendwas, daß es sich um eine
minus-zahl handelt?

Autor: Khani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, Jung' ich glaub Du hast das mit 2er-Komplement net so ganz komplett
verstanden.

Das 2er-Komplement einer Zahl x ist genau die Zahl y, welche in einer
n-Bit Binärdarstellung mit der Zahl x zusammengezählt (addiert) eine 1
und n Nullen ergibt. Da dann die erste 1 im Carry (Überlauf in diesem
Fall landet), kann man das Zweierkomplement y auch als negatives
Äquivalent von x ansehen : y = -x.
Das heißt, wenn man von einer Zahl a eine Zahl b abziehen will kann man
auch stattdessen das Zweierkomplement der Zahl b dazu-addieren.
Umgederht gilt für die Addition a+b auch a-(-b).

Nimm einfach mal den Windows-Taschenrechner und gib 195 ein. Dann
schaltest Du um auf binär und drückst "byte". Das Bitmuster kannst Du
jetzt abschreiben. Jetzt schaltest Du wieder zurück auf "dez" und
gibst -195 ein. Wieder umschalten auf binär und voila - das
Zweierkomplement steht da. Wenn Du jetzt die beiden Binärmuster
eintippst und sie addierst, kommt 0 raus (aber nur, wenn Du brav
weiterhin auf byte schaltest. Schalte einmal auf Word und Du wirst
erkennen, das Du als Ergebnis Deiner Addition eigentlich eine 1 und 8
Nullen erhalten hast.

MfG, Khani

Autor: Khani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja Jörg : Ehre wem Ehre gebührt - Du warst schneller ;-)

MfG, Khani

Autor: fksystems (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
d.h., der controller hat das in sich und sieht das, was mir der
taschenrechner auf der einstellung hex und byte anzeigt, oder nicht?

ok, dann müßte es kla klar sein.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Prozessor bekommt nur ein Bitmuster und rechnet damit.

Die Interpretation, ob Du den Wertebereich als 0...255 oder als
-128...+127 auffaßt, wird außerhalb vorgenommen -- der CPU ist das
völlig egal.  Das schöne an den Zweierkomplementen (und darum haben
sie sich wohl auch durchgesetzt -- es gäbe ja auch andere
Darstellungsmöglichkeiten, beispielsweise Bit 7 als Vorzeichen und Bit
0...6 als Betrag zu betrachten) ist, daß für beide Betrachtungsweisen
(vorzeichenbehaftet oder vorzeichenlos) die eigentliche Rechnung
dieselbe bleibt.

Beispiel:

vorzeichenlos:
  0xc3 = 0b11000011
+ 0x05 = 0b00000101
=        0b11001000 = 0xc8

vorzeichenbehaftet:
  -61 = 0xc3 = 0b11000011
 +  5 = 0x05 = 0b00000101
 =             0b11001000 = 0xc8 = -56

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.