Forum: Mikrocontroller und Digitale Elektronik AVR-Assembler und Flash


von Georg G. (df2au)


Lesenswert?

Wie macht man das folgende eleganter?

           .cseg
tabelle:   .db    1, 2, 3, 4, low(foo * 2), high(foo *2)

foo:       mach   irgendwas
           ret

main:      ldi    r30, low(tabelle *2)
           ldi    r31, high(tabelle *2)
           lpm
           .....

Irgendwie sieht das "*2" blöde aus. Geht das schöner?

von spess53 (Gast)


Lesenswert?

Hi

>Irgendwie sieht das "*2" blöde aus. Geht das schöner?

Wenn eine 1 schöner aussieht. Dann

tabelle << 1

MfG Spess

von Max D. (max_d)


Lesenswert?

If it looks stupid but works it ain't stupid.

von beautifier (Gast)


Lesenswert?

Georg G. schrieb:

> Wie macht man das folgende eleganter?
>
>            .cseg
> tabelle:   .db    1, 2, 3, 4, low(foo * 2), high(foo *2)
>
> foo:       mach   irgendwas
>            ret
>
> main:      ldi    r30, low(tabelle *2)
>            ldi    r31, high(tabelle *2)
>            lpm
>            .....
>
> Irgendwie sieht das "*2" blöde aus. Geht das schöner?

man schreibt anstatt:

"tabelle:"
"foo:"

einfach

".EQU tabelle=PC<<1"
".EQU foo=PC<<1"

Oder, noch hübscher, man verpackt das noch in ein eingängiges Macro

.MACRO PMDATA
.EQU @0=PC<<1
.ENDMACRO

und schreibt dann insgesamt:

PMDATA tabelle
  .db    1, 2, 3, 4, low(foo), high(foo)

PMDATA foo
   mach   irgendwas
   ret

 main:      ldi    r30, low(tabelle)
            ldi    r31, high(tabelle)
            lpm
            .....

Man darf dann aber natürlich nicht auf die Idee kommen, zu schreiben:

            .....
            rcall foo

Das ginge dann fürchterlich gegen den Baum. Und auch:

            ldi ZL,Low(foo)
            ldi ZH,High(foo)
            icall

Das würde genauso knallen.

Ich würde die Idee mit dem PMDATA-Macro also wirklich nur für reine 
Datenkonstanten-Adressen empfehlen, wie in dem Beispiel für "tabelle" 
(wie ja auch schon der Name des Macros suggeriert), sobald die Daten 
aber (ggf. auch) als Sprungziel verwendet werden sollen, würde ich bei 
der klassischen Schreibweise bleiben, hier im Beispiel also für "foo".

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.