Forum: Mikrocontroller und Digitale Elektronik was bedeuten diese befehle


von fksystems (Gast)


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?

von Thomas K (Gast)


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.

von Khani (Gast)


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)

von fksystems (Gast)


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?

von Jörg Wunsch (Gast)


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

von fksystems (Gast)


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?

von Khani (Gast)


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

von Khani (Gast)


Lesenswert?

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

MfG, Khani

von fksystems (Gast)


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.

von Jörg Wunsch (Gast)


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

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.