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
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....
