Assembler - 1 bit in einem Register "kippen"

Gast #4285114
Lesenswert?

DDR erstaunt mich, ist sicher eine interessante Anwendung.
1
  in   r15,DDRB
2
  ldi  r16,(1<<5)
3
  eor  r15,r16
4
  out  DDRB,r15

Falls aber PORT gemeint sein sollte und es sich um einen nicht allzu 
alten AVR-8bit-uC handelt:
1
  sbi  PINB,5
#4285355
Lesenswert?

Ok, das "kippen" hab ich nicht als toggeln verstanden.

Da muss man halt mit sbic/sbis arbeiten:

   sbis ddrb,5
   rjmp label2
label1:
   cbi ddrb,5
   rjmp ende
label2:
   sbi ddrb,5
ende:

Wenn das T-flag anderweitig benötigt wird, ist dies eine Möglichkeit.

Das sieht nach vielen Befehlen aus, aber wenn man den Weg nach sbic 
verfolgt, sinds 3 Befehle, die abgearbeitet werden.

Selbstverständlich ist es am kürzesten, ein Bit im portb zu toggeln, 
wenn der Kontroller sbi pinb,5 im Befehlsvorrat hat.
Gast #4285606
Lesenswert?

S. Landolt schrieb:

> DDR erstaunt mich, ist sicher eine interessante Anwendung.

Kommt schon mal vor, daß man ein DDR-Bit toggeln möchte, um zwischen 
High-Z und einem Logikpegel umzuschalten, z.B. bei "Charlieplexing" zur 
LED-Ansteuerung mit weniger Pins oder auch bei bei der Modulation eines 
per Timer-PWM erzeugten Trägers (das waren nur die beiden Sachen, die 
mir jetzt auf Anhieb zu dem Thema einfielen).

Allerdings: In aller Regel ist es (mangels "eori"-Instruktion) 
wesentlich effizienter, einfach selektiv je nach Code-Kontext ein- bzw. 
auszuschalten.

Trotzdem gehört "eori" definitiv zu den top three der von mir 
meistvermissten AVR-Instruktionen. Die EOR-Funktion braucht man ja 
längst nicht nur für primitive Toggeleien irgendwelcher GPIOs, sondern 
auch für Unmassen anderer Algorithmen. Dafür hätte Atmel meinetwegen 
locker die doch ziemlich überflüssigen adiw/sbiw-Opcodes opfern können 
(die lassen sich ja sehr leicht und ohne Taktverlust durch die Kombi aus 
subi und sbci ersetzen).

Selbst wenn auch dann das "eori" nur für acht Register verfügbar wäre: 
Das wäre es echt wert gewesen.

Übrigens: die anderen beiden meiner top three der meistvermissten 
AVR-Instruktionen sind "cpsne" und "cpci". Was mir von diesen drei nicht 
vorhandenen Instruktionen gerade am wichtigsten erscheint, schwankt 
allerdings stark, je nach aktuellem Projekt. Insgesamt würde ich nach 
einem grep nach "fuck" über alle meine AVR-Sources allerdings "eori" zum 
Sieger erklären, das hat mir eindeutig mit weitem Abstand am häufigsten 
gefehlt, um auch noch das letzte Quentchen des Möglichen aus den kleinen 
Dingern zu kitzeln.
#4285621
Lesenswert?

c-hater schrieb:
> Trotzdem gehört "eori" definitiv zu den top three der von mir
> meistvermissten AVR-Instruktionen.

Jeder dieser 8-Bit Immediate-Befehle frisst 1/16 des Coderaumes weg. Das 
ist auch der Grund, weshalb die unteren Register dran glauben mussten. 
Für jeden neuen Befehl dieser Art müsstest du also klarstellen, welcher 
andere Befehl dieser Art wegfallen darf.

> locker die doch ziemlich überflüssigen adiw/sbiw-Opcodes opfern können

Dadurch wird jeweils nur 1/256 des Opcode-Spaces frei. Wenn du noch 14 
weitere solche Befehle findest tät es für EORI reichen.

ADIW/SBIW werden zudem ziemlich oft gebraucht, zumindest in C. Nämlich 
bei Pointern. Sehr viel häufiger als EORI.

> Übrigens: die anderen beiden meiner top three der meistvermissten
> AVR-Instruktionen sind "cpsne" und "cpci".

Für CPCI ginge ebenfalls 1/16 des Coderaumes drauf.

Was du eigentlich suchst ist eine AVR-Variante mit 17-Bit Befehlsbreite.
Gast #4285653
Lesenswert?

A. K. schrieb:

> ADIW/SBIW werden zudem ziemlich oft gebraucht, zumindest in C.

Eben. Wer braucht schon C bei diesen kleinen Dingern?

Und wie schon gesagt: adiw/sbiw ließen sich ohne Taktverlust 
substitieren.

Scheiß auf den Mehrverbrauch an Flashspace. Flash ist meist sowieso 
genug da oder läßt sich zumindest mit sehr geringem Aufwand vergrößern.

> Was du eigentlich suchst ist eine AVR-Variante mit 17-Bit Befehlsbreite.

Nein, das hast du völlig falsch verstanden. Ich komme natürlich mit dem 
aus, was objektiv da ist. Mir tränen nur die Augen, wenn ich sehe, was 
darüber hinaus alles möglich wäre, wenn man nicht schon beim Design der 
Opcodes Rücksicht auf so einen unnützen Schwachsinn wie "C" genommen und 
damit die vielversprechende Hardware bereits sozusagen pränatal 
kastriert hätte...
#4285704
Lesenswert?

c-hater schrieb:
> Mir tränen nur die Augen, wenn ich sehe, was
> darüber hinaus alles möglich wäre, wenn man nicht schon beim Design der
> Opcodes Rücksicht auf so einen unnützen Schwachsinn wie "C" genommen und
> damit die vielversprechende Hardware bereits sozusagen pränatal
> kastriert hätte...

Nicht weinen. Nimm einfach einen anderen Controller oder leb damit.
Auch ich denke mir beim Befehlssatz des AVR: "Man, hätte man das nicht 
besser machen können!?" Also: Nimm einen 68k oder 8051. Aber rumjammern 
hilft nicht.

---

Hier nicht anwendbar, aber vielleicht dennoch nützlich zu wissen:
Portpins kann man bei den neueren AVRs ganz einfach toggeln, indem man 
das PIN-Register mit 1 beschreibt.


Gruß

Jobst
#4286142
Lesenswert?

A. K. schrieb:
> Was du eigentlich suchst ist eine AVR-Variante mit 17-Bit Befehlsbreite.

Es gibt ja schon einige 32Bit breite Befehle (CALL, JMP, LDS), da hätte 
man haufenweise weitere Befehle unterbringen können.
Es ist ja nicht der Codeverbrauch, sondern die fehlende Atomizität, die 
stört.

Jobst M. schrieb:
> Aber rumjammern hilft nicht.

Was einmal publiziert wurde, läßt sich kaum korrigieren.
Intel und Philips hatten ja auch mal versucht, den 8051 auf 16Bit 
aufzubohren und sind damit kläglich gescheitert. Niemand wollte die 
Dinger haben.
Ich hab noch ein 80C251-Evalboard mit Keil C251 Lizenz rumliegen.
#4286184
Lesenswert?

Peter D. schrieb:
> Es gibt ja schon einige 32Bit breite Befehle (CALL, JMP, LDS), da hätte
> man haufenweise weitere Befehle unterbringen können.

LDS in der heutigen 2-Wort Form entstand m.W. erst, als IAR(?) Atmel im 
Rahmen der frühen Zusammenarbeit dran erinnerte, dass Banking keine gute 
Idee ist.

Haufenweise Befehle unterzubringen war erkennbar nicht das Ziel.

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