Forum: Mikrocontroller und Digitale Elektronik Assembler Frage


von Dieter (Gast)


Lesenswert?

Mogren,

Eine ganz kleine Frage zu sbr:

Wenn ich    sbr r16, 0x01  schreibe wird das erste Bit gesetzt. Was 
passiert mit den bits die davor in dem selben Register gesetzt waren? 
werden gelöscht?

Label 1:
         sbrc r16,Bit3
         rjmp,NixTun1:
         sbrs r16,Bit3
         cbi PortB,0x03
Label 2:
         sbrs r16,Bit1
         rjmp NixTun2
         sbrc r16,Bit1
         sbi  PortB,0x03
         ldi  Temp1,CS12
         out  TCCR1B,Temp1
         sbr  r16,Bit2


Tim1OFISR:
  sbr r16, Bit3;an dieser stelle möchte dass Bit1,Bit2 gelöscht werden
  ldi Temp1,CS12
  OUT TCCR1B, Temp1
  clr Temp1

von 42 (Gast)


Lesenswert?

Dieter schrieb:
> passiert mit den bits die davor in dem selben Register gesetzt waren?
> werden [die] gelöscht?
Nein, wie ein Blick ins Instruction Set oder in den Simulator verraten 
hätte.

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

>Wenn ich sbr r16, 0x01  schreibe wird das erste Bit gesetzt

Nein du schreibst 0b0000.0001 in das Register 16, also explizit Null in 
die anderen Bits des Registers.

von Philipp (trivix)


Lesenswert?

Schau dir mal den Artikel zur Bitmanipulation an ;)

http://www.mikrocontroller.net/articles/Bitmanipulation

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Im Instruction Set Seite 127 http://www.atmel.com/Images/doc0856.pdf
1
sbr r16,3 ; Set bits 0 and 1 in r16

von MWS (Gast)


Lesenswert?

Rene Schube schrieb:
>>Wenn ich sbr r16, 0x01  schreibe wird das erste Bit gesetzt
>
> Nein du schreibst 0b0000.0001 in das Register 16, also explizit Null in
> die anderen Bits des Registers.

Huh ?

Das SBR ist nur eine andere Bezeichnung für ein ORI, da wird nix 
überschrieben.

von Charly B. (charly)


Lesenswert?

Rene Schube schrieb:
>>Wenn ich sbr r16, 0x01  schreibe wird das erste Bit gesetzt
>
> Nein du schreibst 0b0000.0001 in das Register 16, also explizit Null in
> die anderen Bits des Registers.

immer wieder gern genommen:

http://www.youtube.com/watch?v=vNc6mIwH9lI

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Dieter schrieb:
> Mogren,
>
> Eine ganz kleine Frage zu sbr:
>
> Wenn ich    sbr r16, 0x01  schreibe wird das erste Bit gesetzt.
> ...
>
SBR – Set Bits in Register

Diese Befehle haben mich auch schon wahnsinnig gemacht (sbr, cbr,
sbi, cbi,      sbrs, sbrc,      sbis, sbic ). Ein kleines Detail erklärt 
beim Befehl SBR einiges, nämlich Set Bit ( s )in Register.
Was z.B. bedeutet das sbr r16,$03 nicht Bit3, sondern Bit0 und Bit1 
setzt und die anderen so läßt wie sie waren.

Description:
Sets specified bits in register Rd. Performs the logical ORI between the 
contents of register Rd and a constant mask K and
places the result in the destination register Rd.


Bernd_Stein

von (prx) A. K. (prx)


Lesenswert?

Empfehlung: SBR/CBR vermeiden und ORI/ANDI verwenden.

Weshalb Atmel das so zweifelhaft definiert hat ist mir auch nicht klar. 
Mit einer Bitnummer, die vom Assembler in die Maske umgerechnet worden 
wäre, hätten diese Aliase einen Sinn ergeben. So wie sie definiert sind 
dienen sie nur zur Verwirrung.

von Thomas P. (topla)


Lesenswert?

Bernd Stein schrieb:
> Diese Befehle haben mich auch schon wahnsinnig gemacht

Der gesamte Befehlssatz der AVRs treibt mich auf Grund der teilweise 
nicht vorhandenen Logik öfters in Richtung Wahnsinn, vor allem, wenn man 
von den 8051ern kommt. Der ist darauf ausgelegt, die Entwickler zu 
Hochsprachen zu nötigen.

Thomas

von spess53 (Gast)


Lesenswert?

Hi

>Der gesamte Befehlssatz der AVRs treibt mich auf Grund der teilweise
>nicht vorhandenen Logik öfters in Richtung Wahnsinn, vor allem, wenn man
>von den 8051ern kommt.

Warum?

MfG Spess

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thomas P. schrieb:
> Der ist darauf ausgelegt, die Entwickler zu
> Hochsprachen zu nötigen.

Nein.  Dann hätte man die Aliasnamen SBR, CBR, CLR und dergleichen
auch gleich ganz weglassen können.  Ein Compiler hat keine
Bauchschmerzen oder Dokumentationsprobleme damit, ein Bit mit dem
Befehl ORI zu setzen oder ein Register mit XOR rd,rd zu löschen.

Der Mischmasch zwischen Bitnummern und Bitmasken ist dagegen in der
Tat Mist, auch und gerade aus Sicht der Hochsprache.  Es wäre viel
einfacher gewesen, die Bits alle als Masken zu definieren (also
PB0 als 0x01 statt als 0, PB1 als 0x02 statt 1 usw.), denn das ist
das, was man in C ohnehin benutzen muss.  Für ein "SBI PORTB, PB0"
hätte der Assembler ja problemlos die Bitmaske in die für den
Opcode notwendige Bitnummer umrechnen können und sich ggf. dann
beschweren, wenn im Operanden etwas anders steht als eine Zahl, die
genau ein Bit gesetzt hat.

Ist aber nun leider zu spät.

von Charly B. (charly)


Lesenswert?

@Thomas

dann mach mal asm f. PiC16C54, da ist der AVR asmn wie urlaub dagegen ;)

von bitte löschen (Gast)


Lesenswert?

Es gibt noch andere Pseudo-Befehle. Wenn man sich mal die Opcodes der 
ganzen bedingten Sprünge (BRCC, BRSH, ... BRIE) anschaut, stellt man 
fest, dass das Variationen von BRBC und BRBS sind.

Ich denke, das hat Marketing-Gründe. "133 Powerful Instructions" klingt 
halt toll.

Ich schlag vor, diesen Thread zu löschen, da er mehrfach falsche 
Informationen enthält und den völligen Neuling, der ihn vielleicht in 
google findet, mehr verwirrt als hilft.

von (prx) A. K. (prx)


Lesenswert?

Philipp Klostermann schrieb:

> Ich denke, das hat Marketing-Gründe. "133 Powerful Instructions" klingt
> halt toll.

Wobei Microchip bei den 8-Bit PICs die Anzahl der Befehle extra 
runterrechnet, um mit möglichst wenig Befehlen werben zu können.

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.