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?
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.
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)
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?
> 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
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?
Ä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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.