ASM AVR CBR - Clear Bits in Register

Gast #2481867
Lesenswert?
• ▲
▼
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.
(Firma: Anscheinend Corner-Cases ;-)) #2481895
Lesenswert?
• ▲
▼
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
#2481919
Lesenswert?
• ▲
▼
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
Gast #2481921
Lesenswert?
• ▲
▼
>
> 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.
Moderator Persönliche Seite #2481927
Lesenswert?
• ▲
▼
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.
Gast #2481939
Lesenswert?
• ▲
▼
>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? :-)
#2481979
Lesenswert?
• ▲
▼
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
Moderator Persönliche Seite #2481986
Lesenswert?
• ▲
▼
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.
#2482279
Lesenswert?
• ▲
▼
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.