Seite 3 von 3

Verfasst: 12.09.2007 07:34
von Thorium
Solange man nur innerhalb der Prozedur springt kann nix passieren. Wenn du aber von einer Prozedur in eine andere springst und dort auf lokale Variablen zugreifst, wird das unweigerlich zu schweren Fehlern führen. Da die lokalen Variablen auf dem Stack liegen.

Verfasst: 12.09.2007 08:41
von Christi
wie wärs mit CallFunctionFast?

Verfasst: 13.09.2007 06:52
von Thorium
Christi hat geschrieben:wie wärs mit CallFunctionFast?
Sehr schlechte Idee. Das ist kein GoTo sondern praktisch ein GoSub. Der Unterschied ist das beim GoSub (Assembler: Call) eine Rücksprungadresse auf den Stack gepusht wird. Würdest du nun CallFunctionFast missbrauchen um zu einem Label zu springen währen alle lokalen Variablen auf dem Stack um 4 Byte verschoben. Das einzige was wirklich Sinn macht ist in der tat ein echtes GoTo also Assembler: Jmp. Das geht auch ohne den Inline-Assemblersupport zu aktivieren.

Code: Alles auswählen

Define.l JmpDest

JmpDest = ?Blub
!mov eax,[p.v_JmpDest]
!jmp eax

Blub:

Das geht auch ohne das EAX-Register zu ändern.

Code: Alles auswählen

Define.l JmpDest

JmpDest = ?Blub
!push [p.v_JmpDest]
!ret

Blub:

Verfasst: 13.09.2007 11:06
von Kaeru Gaman
@Thorium
tja, das kommt davon, wenn man aus faulheit die erste seite des topics nicht mehr liest... /:->
http://www.purebasic.fr/german/viewtopi ... 608#169608
Kaeru Gaman hat geschrieben:

Code: Alles auswählen

  !JMP [v_ziel]

wie du siehst, muss man weder ein register noch den stack mißbrauchen

Verfasst: 13.09.2007 11:13
von Christi
Thorium hat geschrieben:Das ist kein GoTo sondern praktisch ein GoSub. Der Unterschied ist das beim GoSub (Assembler: Call) eine Rücksprungadresse auf den Stack gepusht wird...
is mir schon klar... nimmt man halt keine labels