| |
|
|
Frank Abbing | In einem anderen Thread wurde das Beispiel genannt, eine eigene Assemblerfunktion aus einer anderen aufzurufen: KompilierenMarkierenSeparieren {$Clq}
Declare A&,B&,C&,D&
Cls
Print "Test Start:"
Asmstart Zweite
Parameters a&,b&
Return c&
mov eax,para1
mov ebx,para2
add eax,ebx
Asmend
Asmstart Erste
Return d&
Local Var1 :DWORD
Local Var2 :DWORD
mov Var1,6
mov Var2,3
Scall Zweite,Var1,Var2
Asmend
Print "Ergebnis (6+3=9): " + Str$(D&)
Waitkey
End
In meinem aktuellen Programm mache ist reichlich von XPIA Gebrauch, und da ist mir eine Fehlerquelle aufgefallen. Übergibt man Parameter von einer Funktion an eine andere, so müssen vorher die eigenen Parameter gerettet werden. Das ist auch logisch, weil XPIA zur Vereinfachung der Parameterübergabe interne Variablen benutzt. Natürlich müssen diese global sein. Darum kann eine aufgerufene Funktion die Parameter der aufrufenden Funktion verändern. Diese gilt es also vor Aufruf zu retten! Ein Beispiel mit Parametern, um das zu verdeutlichen: KompilierenMarkierenSeparieren {$iq}
Declare z1&,z2&
Cls
Asmstart Eins (0,0)
mov eax,para1
add eax,para2
Asmend
-------------------------
Asmstart Zwei (10,15)
Scall Eins,500,45
add eax,para1
add eax,para2
Asmend (z1&)
-------------------------
Asmstart Drei (10,15)
push para1
push para2
Scall Eins,500,45
pop para2
pop para1
add eax,para1
add eax,para2
Asmend (z2&)
Print "500 + 45 + 10 + 15 = " + Str$(z1&)+" Falsch!"
Print "500 + 45 + 10 + 15 = " + Str$(z2&)+" Richtig!"
WaitInput
End
Funktion Zwei arbeitet mit falschen Werten weiter, während Funktion Drei richtig arbeitet.
Natürlich funktioniert die herkömmliche Art der Parameterübergabe - ohne die Vereinfachung - wie gewohnt: KompilierenMarkierenSeparieren |
|
|
| |
|
|