Seite 1 von 1

Sprungmarke in Macro

Verfasst: 01.10.2012 18:10
von 7x7
Wenn ich in einem Macro eine Sprungmarke definiere, habe ich logischerweise das Problem, dass das Macro nicht mehrfach im Sourcecode eingesetzt werden kann, weil der Compiler dann den Fehler "Doppelte Sprungmarke" erzeugt.

Weiss jemand eine geniale Lösung dazu?

Code: Alles auswählen

Macro beispiel
	;hier steht Code
	Sprungmarke:
	;hier gehts weiter
EndMacro

beispiel
beispiel

Re: Sprungmarke in Macro

Verfasst: 01.10.2012 18:22
von NicTheQuick
Falls du nur innerhalb deines Codes im Makro zu der Sprungmarke springen musst, würde ich es so machen:

Code: Alles auswählen

Macro beispiel
	Repeat
		;hier steht Code
		If (irgendwas)
			Break
		EndIf
		;hier steht noch mehr Code
		Break
	ForEver
EndMacro

beispiel
beispiel 

Re: Sprungmarke in Macro

Verfasst: 01.10.2012 19:12
von Derren
So wie man das normal auch ohne Sprungmarke löst?

Code: Alles auswählen

Macro Sprung
  ;Hier geht's weiter
EndMacro

Macro Beispiel
  ;Hier steht Code
  Sprung
EndMacro

Beispiel
Beispiel
Der Sinn von einem Macro ist doch, dass man sich wiederholenden Code nicht zweimal schreiben muss.
Die Sprungmarke gehört da einfach nicht rein.

Code: Alles auswählen

Macro Bei
  ;Hier steht Code
EndMacro

Macro Spiel
  ;Hier geht's weiter
EndMacro

Macro Beispiel
  Bei
  Spiel
EndMacro

Bei
Sprungmarke:
Spiel

BeiSpiel

Re: Sprungmarke in Macro

Verfasst: 01.10.2012 21:28
von STARGÅTE
Das Problem kann man mit sogenannten anonymen Labels beheben, allerdings sollte man damit vorsichtig umgehen, da nur relative sprünge möglich sind:

Code: Alles auswählen

Macro beispiel
  Debug a
  If a = 1
  	!jmp @f ; springt nach vorne zum nächsten anonymen Label
  EndIf
  Debug "a ist nicht 1"
  !@@: ; Anonymes Label
EndMacro


a = 1

beispiel

a = 2

beispiel
!@@: ist das Label
!jmp @f springt nach vorn und !jmp @b springt zurück.

Re: Sprungmarke in Macro

Verfasst: 01.10.2012 21:49
von 7x7
NicTheQuick hat geschrieben:..., würde ich es so machen:
Kann ich in meinem Fall nicht so tun
Derren hat geschrieben:Die Sprungmarke gehört da einfach nicht rein
Muss aber :mrgreen:
STARGÅTE hat geschrieben:Das Problem kann man mit sogenannten anonymen Labels beheben...
Genial!

Danke euch!

Re: Sprungmarke in Macro

Verfasst: 02.10.2012 08:16
von Danilo
So geht es mit generierten Namen, die man auch verschachteln kann:

Code: Alles auswählen

! macro generateLabel {
!  local Label1
!  MyLabel1 equ Label1
! }

Macro beispiel
  !generateLabel    ; neuen Namen für 'MyLabel1' generieren
  Debug a
  If a = 1
     !jmp MyLabel1  ; springt zum dem generierten Label 'MyLabel1'
  EndIf
  Debug "a ist nicht 1"
  !MyLabel1:
  !restore MyLabel1 ; vorherigen Name wieder herstellen, bei Verschachtelung
EndMacro


a = 1

beispiel

a = 2

beispiel
Verwende ich bei [Windows XP+] Try .. Catch .. EndTry - Error Handling, wo man die Macros auch verschachteln können muss und ich 3 Labels brauchte.
Mit anonymen Labeln gehen solche Verschachtelungen nicht, da einfach nur zum Nächsten nach vorn oder hinten gesprungen wird.


Beispiel um die Verschachtelung zu sehen:

Code: Alles auswählen

! macro generateLabel {
!  local Label1
!  MyLabel1 equ Label1
! }

Macro beispiel
  !generateLabel ; neuen Namen für 'MyLabel1' generieren
  Debug a
  If a = 1
    !JMP MyLabel1  ; springt zum letzten MyLabel1 im Macro
  EndIf

      !generateLabel    ; neuen Namen für 'MyLabel1' generieren
        !JMP MyLabel1   ; springt in die nächste Zeile, zum aktuellen "MyLabel1"
      !MyLabel1:
      Debug "inneres MyLabel1"
      !restore MyLabel1 ; vorherigen Name wieder herstellen, bei Verschachtelung
      ; nach dem restore ist wieder das vorherige MyLabel1 aktuell, also das in der nächsten Zeile
  !MyLabel1:
  Debug "aeusseres MyLabel1"
  !restore MyLabel1 ; vorherigen Name wieder herstellen, bei Verschachtelung
EndMacro

a = 1

beispiel

a = 2

beispiel
'MyLabel1:' wird hier 2mal verwendet, aber immer durch einen anderen Namen ersetzt, den '!generateLabel' generiert hat.

Re: Sprungmarke in Macro

Verfasst: 02.10.2012 19:39
von 7x7
Für meinen Bedarf komme ich im Moment mit den anonymen Labels gut zurecht.

Generierte Namenslabel sind aber auch interessant. Verstehe ich das richtig, dass "Label1" sowas wie ein Counter ist und "MyLabel1 equ Label1" dann ein (bei Aufruf) fortlaufendes Label erstellt?

Eigentlich kann es ja nicht anders sein. Aber da stellt sich in meinem Kopf der Begriff "Local" quer (müsste ja immer bei Aufruf dann "Label1" neu initialisiert werden)?

Muss mich vielleicht doch mal wieder intensiver mit der entsprechenden Assembler-Lektüre beschäftigen

Re: Sprungmarke in Macro

Verfasst: 03.10.2012 06:56
von Danilo
7x7 hat geschrieben:Verstehe ich das richtig, dass "Label1" sowas wie ein Counter ist
Counter mit Zahlen nicht unbedingt, aber "Local Label1" erstellt immer einen neuen, einmaligen Namen.
Ob man den generierten Name für Variablen oder Labels benutzt ist wohl egal.
7x7 hat geschrieben:und "MyLabel1 equ Label1" dann ein (bei Aufruf) fortlaufendes Label erstellt?
Man kann sagen, MyLabel1 ist sowas wie ein Macro, dem hier der eindeutige Name von Label1 zugewiesen wird.
Überall wo man nun "MyLabel1:" benutzt, wird es wie Macros ersetzt - mit dem automatisch generierten Namen.

"restore" stellt den vorherigen Inhalt des Macros wieder her.

Re: Sprungmarke in Macro

Verfasst: 03.10.2012 09:31
von 7x7
Ok, das erscheint mir im Moment alles klarer. Vermutlich werde ich aber beim ersten praktischen Einsatz diese Seite noch mal aufrufen müssen... :)

Danke!

Edit:
...generierter Name als Variable?!! Hochinteressant.... :mrgreen: