Hi,
habe eine Frage.
Im Register 24 steht z.B. eine 4. Die wird da reigeladen.(Werte zwischen
0 u.7 liegen da drin.)
Dann möchte ich im Register 18 das 4te Bit setzten bzw. löschen.
So geht es.
cbr r18,4 ;Löscht das Bit 4 im Register R18
aber wie mache ich das wenn ich das Register R24 verwenden will als
konstante?
Danke.
Holger schrieb:
...
> Dann möchte ich im Register 18 das 4te Bit setzten bzw. löschen.>> So geht es.> cbr r18,4 ;Löscht das Bit 4 im Register R18>
Ich vertue mich damit auch immer. Vielleicht sogar jetzt auch.
Aber für mich löscht DU das Bit2 in r18 ( 2^2 = 4 ).
müsstest daher
cbr r18,1<<4
schreiben.
>> aber wie mache ich das wenn ich das Register R24 verwenden will als> konstante?>
Die Frage verstehe ich leider nicht. Kannst DU sie vielleicht etwas
anders formulieren ?
Bernd_Stein
Holger schrieb:> Hi,>> habe eine Frage.> aber wie mache ich das wenn ich das Register R24 verwenden will als> konstante?
aus dem Wert in R24 musst du mithilfe einer Schleife eine Bitmaske
erstellen, die du dann mit r18 UND verknüpfst.
ldi tempreg,0 ;hilfsreg
sec ;CY=1
loop: rol tempreg ;Bit reinschieben
dec r24
brne loop
com tempreg ;Maske invertieren
and r18,tempreg ;gewünschtes Bit löschen
Sascha
>> aber wie mache ich das wenn ich das Register R24 verwenden will als> konstante?>
Das wäre also sozusagen ein "parametrisches" setzen oder löschen.
Dafür gibt es beim AVR keinen Maschinenbefehl. Andere CPUs haben sowas.
Aber eben nicht alle und jede. Beim AVR ist die Begründung insbesondere,
das es sich um einen Prozessor mit RISC-Befehlssatz ("Reduced
Instruction Set Computer", also "Reduzuierter-Befehlsatz-Computer")
handelt. Manche, sicherlich wünschenswerte und sinnvolle Befehle gibt es
eben da nicht.
In so einem Fall muss man also dafür ein Programm schreiben, das sowas
erledigt.
Schau Dir mal den Befehlssatz an und den Artikel
http://www.mikrocontroller.net/articles/Bitmanipulation hier.
Noname schrieb:> Beim AVR ist die Begründung insbesondere,> das es sich um einen Prozessor mit RISC-Befehlssatz ("Reduced> Instruction Set Computer", also "Reduzuierter-Befehlsatz-Computer")> handelt. Manche, sicherlich wünschenswerte und sinnvolle Befehle gibt es> eben da nicht.
Ist nur die halbe Begründung. Die andere Hälfte der Begründung ist,
dass die CPU keinen barrel shifter hat, d. h. sie kann nicht um
beliebige Bitanzahlen auf einmal schieben, sondern pro Befehl nur um
ein Bit.
>Ist nur die halbe Begründung.
Naja. Was war zuerst da? Die Henne oder das Ei? Gibt es den Befehl nicht
weil es keinen Barrelshifter gibt oder keinen Barrelshifter weil es den
Befehl nicht gibt. Oder ganz anders: Gibt es wegen Kosten und Chipfläche
keinen Barrelshifter und deswegen keinen Befehl dafür? Oder gibt es das
wegen des RISC-Aufklebers beides nicht? :-)
spess53 schrieb:> Hi>>> ldi tempreg,0 ;hilfsreg>> sec ;CY=1>>loop: rol tempreg ;Bit reinschieben>> dec r24>> brne loop>> Und wenn r24=0 ist?
ja, ja - hatte erst den dec vorn dran und dann noch mal umgestellt,
so wär's dann richtig ...
ldi tempreg,0 ;hilfsreg
inc r24
sec ;CY=1
loop: rol tempreg ;Bit reinschieben
dec r24
brne loop
com tempreg ;Maske invertieren
and r18,tempreg ;gewünschtes Bit löschen
Sascha
Noname schrieb:> Gibt es wegen Kosten und Chipfläche> keinen Barrelshifter und deswegen keinen Befehl dafür?
Das wird es treffen.
Ohne den RISC-Aufkleber wiederum könnte es einen solchen Befehl halt
auch trotz fehlendem barrel shifters trotzdem geben.
> Oder gibt es das> wegen des RISC-Aufklebers beides nicht? :-)
Andere RISC-CPUs haben sowas durchaus, ARM beispielsweise.
Noch ein Tick kürzer und mit Wortspiel:
ldi temp,$FF ; Alles an
inc BitNummer ; wegen 0 * Schleife
clc ; 0 ins Carry
L1:
rol temp ; beim 1. Mal 0 reinschieben - 1 ins Carry
dec BitNummer ; beim 2.-7. 1 reinschieben - 1 ins Carry
brne L1 ;
ANDe: and ZielReg,temp ; Bit löschen
gruss herrmueller