| |
|
|
Normann Strübli | Hallo,
vielleicht habe ich es ja irgendwo überlesen, aber sind Prozeduren innerhalb des XPIA-Codes erlaubt?
Geht das? Und wie kann dann die obere Prozedur etwas an die aufrufende übergeben wenn ret nicht erlaubt ist?
Gruß Normann |
|
|
| |
|
|
|
| Nun Du könntest an den AsmStart-Bereich per Parameters die Prozeduradresse einer Profanprozedur angeben um diese dann mit Call aufzurufen. Wie das mit der Parameterübergabe & des Returnwertes aussieht - ich mag eigendlich nicht drüber nachdenken.
Generell würde ich davon abraten aus der AsmProc eine XPrfProc zu callen.
Salve. |
|
|
| |
|
|
|
Normann Strübli | Nein iF, das hast du falsch verstanden
Ich habe zwei Prozeduren innerhalb eines ASM-Blockes und die eine soll die andere Aufrufen. Von einem XPrfProc-Aufruf war nicht die Rede...
Die Frage war ob mehrer Prozeduren innerhalb des ASM-Blockes erlaubt sind die sich gegenseitig aufrufen können und was dann mit <ret> passiert.
|
|
|
| |
|
|
|
Michael Dell | Hi,
ob Verschachtellung erlaubt ist weiß ich nicht.
Aber das hier geht: 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
|
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 09.11.2005 ▲ |
|
|
|
|
| [quote:b049d93a42]Nein iF, das hast du falsch verstanden [/quote:b049d93a42]Von was für Prozeduren redest Du dann? In ASM gibts keine Prozeduren - ich musste also annehmen das Du von XProfan-Prozeduren redest - von was sonst?
Asm-Bereiche sind keine Prozeduren - sondern Funktionen.
Salve. |
|
|
| |
|
|
|
Frank Abbing | Hi,
zu Michaels Lösung benötigst du noch das Macro Scall: KompilierenMarkierenSeparierenScall MACRO name:REQ,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22
FOR arg,<p22,p21,p20,p19,p18,p17,p16,p15,p14,p13,
p12,p11,p10,p9,p8,p7,p6,p5,p4,p3,p2,p1>
IFNB <arg>
push arg
ENDIF
ENDM
call name
ENDM
Das kannst du am besten (zu den anderen Macros) in XPIAs Datei includeasis.inc schreiben. Für die nächste XPIA-Version hab ich das jetzt mal gemacht, ist ja ein sinnvolles Macro. Michaels Lösung ist die einfachste, für eigene Funktionen anstatt invoke einfach Scall verwenden.
Call geht natürlich auch, wenn die Parameter in umgekehrter Reihenfolge auch dem Stack abgelegt werden. Invoke geht nur, wenn die Funktionen vorher definiert werden. Ist was für die nächste XPIA-Version.
P.S.: Zwei Funktionen in einem Assemblerblock gehen natürlich nicht. |
|
|
| |
|
|
|
Normann Strübli |
Danke, ich denke das hat mir weitergeholfen Aber es kommt bestimmt noch die ein- oder andere Frage von mir....
Gruß Normann |
|
|
| |
|
|
|
Normann Strübli | Und da ist sie schon, die nächste Frage:
Der XPIA meldet bei folgenden Code: Maschinencode konnte nicht generiert werden! Ich sehe da aber kein Fehler -oder? Irgendetwas hab ich da wohl noch nicht kapiert. KompilierenMarkierenSeparieren...
Declare istring$,pb&
Asmstart String2Dword
Parameters addr(istring$)
Return pb&
LOCAL Result:DWORD
mov Result,0
mov edi,para1
invoke lstrlen,para1
.while eax!=0
xor edx,edx
mov dl,byte ptr [edi]
sub dl,"0"
mov esi,eax
dec esi
push eax
mov eax,edx
push ebx
mov ebx,10
.while esi > 0
mul ebx
dec esi
.endw
pop ebx
add Result,eax
pop eax
inc edi
dec eax
.endw
mov eax,Result
Asmend
|
|
|
| |
|
|
|
Michael Wodrich | Mal schauen:
- bei Parameters ist keine Variable angegeben sondern eine Funktion. - eax ist ein Ergebnis- und Rechenregister, für Zähler ist ecx besser geeignet (eher aus alter Zeit)
Es wird wohl an Parameters liegen. Einfach mal testen.
Schöne Grüße Michael Wodrich
Hab hier leider keine Werkzeuge vorliegen. |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 09.11.2005 ▲ |
|
|
|
|
Normann Strübli | Aber in der Doku von Frank steht ja auch:
[quote:e9d72de353]Parameters x&, bereich#, addr(string$)[/quote:e9d72de353]
|
|
|
| |
|
|
|
Michael Wodrich | Dann ändere bitte mal den Namen der Prozedur. Das wollte ich erst mit schreiben, hatte es aber verworfen. Evtl. hängt es doch mit der Art der Namensgebung zusammen (hier speziell mit dem Wort DWORD). |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 09.11.2005 ▲ |
|
|
|
|
Normann Strübli | Nein, das ist es leider auch nicht. aber trotzdem danke für Deine schnelle Hilfe!
Gruß Normann |
|
|
| |
|
|