Assembler Frage

Gast #2601493
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
(Firma: Anscheinend Corner-Cases ;-)) #2601601
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
#2601605
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.
Moderator Persönliche Seite #2601638
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.
Gast #2601898
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren