PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisfrage: LDI TEMP, (1<<INT1)|(0<<INT0)



Mitch64
06.09.2009, 11:18
Hallo an alle Programmierer.

Ich habe eine Verständnisfrage:

In einem Assembler-Programm habe ich den folgenden Ausdruck gefunden:


LDI TEMP, (1<<INT1)|(0<<INT0)

Was passiert hier genau?

in der Variablen TEMP (was als Register definiert ist) wird das Bit INT1 (Bit7) gesetzt und BIT INT0 (Bit6) gelöscht?


Und was passiert mit den übrigen Bits, die in Temp bereits gesetzt sind? Bleiben die erhalten oder werden die gelöscht?

Und was bewirkt sowas:


LDI Temp,(1<<URSEL)|(3<<UCSZ0)

Wird hier Bit URSEL (Bit7) und UCSZ1 + UCSZ0 (Bit2+Bit1) gesetzt?

Es handelt sich hierbei um ein Assemblerschnipsel für einen ATmega8.

Danke vorab für eure Info!

Mitch.

pacer_one
06.09.2009, 13:02
Klingt jetzt vielleicht blöd, aber probiere es doch einfach im Simulator mal aus. Per Einzelschritt ist super zu sehen was passiert.

Als Tipp, eigenes Programm in dem nur die besagten Zeilen eingebaut sind.
Um herauszufinden, ob das Register komplett überschrieben wird, kannst du das Register auch mit einem anderen Wert vorladen.

Bei dem senkrechten Strich handelt es sich um eine logisches ODER
man könnte auch dem Wert direkt laden, ist aber nicht so tranparent.

URSEL und UCSZ0 sind Bit die zu Funktionalität der UART benötigt werden, das heißt, dass du dort suchen musst.

Wenn du mit dem Simulator nicht klar kommst, kannst du immer noch nachfragen

Gruß, pacer

Mitch64
06.09.2009, 13:12
Ich habe keinen Simulator für Assembler. Deshalb frage ich ja.

Ich will den Part in Bascom (Inline-Assembler) zum laufen bringen.

Die Frage ist ob das:
LDI TEMP, (1<<INT1)|(0<<INT0)

das gleiche ist wie das:

LDI TEMP,0b10000000

markusj
06.09.2009, 13:33
Hallo,



LDI TEMP, (1<<INT1)|(0<<INT0)
der zweite Teil ist Käse - es wird nur das Bit für INT1 gesetzt, die Null verändert nichts, weil das ganze ja über ODER verknüpft ist. Um das Bit für INT0 zu löschen müsste man
ANDI TEMP, ~(1<<INT0) machen, das würde alle Bits (sofern gesetzt) außer dem Bit von INT0 gesetzt lassen.


Und was passiert mit den übrigen Bits, die in Temp bereits gesetzt sind? Bleiben die erhalten oder werden die gelöscht?
Die werden gelöscht.



LDI Temp,(1<<URSEL)|(3<<UCSZ0)
Wird hier Bit URSEL (Bit7) und UCSZ1 + UCSZ0 (Bit2+Bit1) gesetzt
Ja, außerdem wird der Rest gelöscht/nicht gesetzt - im übrigen halte ich dieses Manöver mit (3<<UCSZ0) für gefährlich, da baut man schnell nen Fehler oder übersieht, dass anstelle einer Eins die Drei da steht.

mfG
Markus

Edit: Kurzantwort auf die aktuelle Frage: Ja

Mitch64
06.09.2009, 13:41
hab ich mir fast gedacht, dass der Rest bei (1<<xxx) gelöscht wird.
Das mit der Tilde war mir aber neu. Man lernt nie aus.

Danke für die Info!

Besserwessi
06.09.2009, 15:05
Das mir dem 1 << Bitname ist ein aus C entliehene Schreibweise für 1*2^Bitname. Die Schreibweise mit (0 << xxx) ist Geschmackssache:
Es tut nichts, denn 0*2^xxx = 0, ist also nur eine umständliche Schreibweise für die 0.
Wnn man es so gewohnt ist, ist es eine elegante Wise sich in Einnerung zu rufen welche Bits noch zu dem Register gehören und nicht gesetzt werden, und man kann es schnell so ändern das die Bits gestzt werden.
Wenn man die Form nicht kennt, oder nutzt, kann man da leicht übersehen das da eine 0 statt der 1 steht, weil man es nicht anders kennt.

PicNick
06.09.2009, 17:18
Geschmackssache:
Kann man eigentlich garnicht sagen, denn es bleibt dir bei C nix anderes übrig.
2^bit wäre eine exponentialfunktion, ich glaub "pow(...)".

Besserwessi
06.09.2009, 18:06
Die Geschmakssche bezoht sich auf die umständliche Null als (0<<xxx). Da kann man natürlich gleich 0 schreibe oder es ganz weglassen.

An (1<<xxx) hat man sich in C schnell gewöhnt, das ist Standard.