mikrocontroller.net

Forum: Projekte & Code PUSH/POP/MACRO für AVR in Assembler


Autor: Dagobert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.MACRO  PUSHER
  push  ZL
  push  ZH
  rcall pu
pu:  pop   ZH;l
  pop   ZL;h
  rjmp  @0
.ENDMACRO


.MACRO  POPER
  rcall po
po:  pop  ZH;l
  pop  ZL;h
  rjmp @0
  pop  ZH
  pop  ZL
.ENDMACRO


meinelieblingspushfunktion1:

  push meinlieblingsregister1
  push meinlieblingsregister2
  push meinlieblingsregister3
  ;etc

  ;Muss hier immer stehen:
  ;-----------------------
  adiw ZL,3
  push ZL
  push ZH
  ret

meinelieblingspopfunktion1:
  pop  meinlieblingsregister3
  pop  meinlieblingsregister2
  pop  meinlieblingsregister1
  ;etc

  ;Muss hier immer stehen:
  ;-----------------------
  adiw ZL,3
  push ZL
  push ZH
  ret



Aufruf dann in einer Funktion:

Funktion:
PUSHER meinelieblingspushfunktion1:

;Code

POPER  meinelieblingspopfunktion1:
ret


Sinn macht es natuerlich nur, wenn man mehr als 6 Register weglegen 
will.
Bei weniger ist der Overhead zu groß, zumindest muß man aber nicht so 
viel
schreiben.

Bei sehr großen Programmen, die vielleicht schon Speicherplatzprobleme 
haben,
könnten diese Makros vielleicht wieder einige Bytes einsparen.

Autor: Ludger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nutze etwas aehnliches, jedoch spare ich beim Ruecksprung noch durch 
einen indirekten Sprung :-)

ijmp           ; Return address is in Z and so this ijmp returns from 
subroutine

Autor: Dagobert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bin einer der Gelegenheitsprogrammierer, die noch ab und zu wieder
ins instruction manual schauen müssen ;-)
Danke für den Hinweis :-)

Autor: Joerg Wolfram (joergwolfram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In meinen aktuellen Programmen nutze ich ein ähnliches Verfahren, wobei 
R0/R1 immer nur lokal genutzt werden, so z.B, um alle 3 Pointer zu 
sichern / zu restaurieren:
push_ptr: pop   R0          ;Return-Adresse merken
          pop   R1
          push  ZH
          push  ZL
          push  YH
          push  YL
          push  XH
          push  XL
          push  R1
          push  R0
          ret

pop_ptr:  pop   XL
          pop   XH
          pop   YL
          pop   YH
          pop   ZL
          pop   ZH
          ret
Im Unterprogramm sieht das dann so aus:
subr:     call  push_ptr
          ...
          jmp   pop_ptr
Wenn man oft die gleichen Register sichern und wieder restaurieren muß, 
spart das eine ganze Menge Speicherplatz, allerdings zu Lasten längerer 
Ausführungszeit.

Jörg

Autor: Dagobert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich war blind, es geht ja noch einfacher:

.MACRO  PUSHER
  push  ZL
  push  ZH
  rcall @0
.ENDMACRO


.MACRO  POPER
  rcall @0
  pop  ZH;l
  pop  ZL;h
.ENDMACRO


meinelieblingspushfunktion1:
  pop  ZH;l
  pop  ZL;h
  ;-----------------------

  push meinlieblingsregister1
  push meinlieblingsregister2
  push meinlieblingsregister3
  ;etc

  ;Muss hier immer stehen:
  ;-----------------------
  ijmp


meinelieblingspopfunktion1:
  pop  ZH;l
  pop  ZL;h
  ;-----------------------

  pop  meinlieblingsregister3
  pop  meinlieblingsregister2
  pop  meinlieblingsregister1
  ;etc

  ;Muss hier immer stehen:
  ;-----------------------
  ijmp

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.