Forum | | | | - Seite 1 - |
| Ragnar Rehbein | hallo IF !
auch wenn du im moment wichtigere sorgen hast, kurz 3 kleine fehlerchen: 1. KompilierenMarkierenSeparieren bringt den XPSE zum absturz. das ^ ist mir aus versehen in den quelltext geraten (kleiner ausrutscher, den ich nicht bemerkt habe oder waren es die kinder ??? mit ihren süßen grabbelpfötchen ???).
2. KompilierenMarkierenSeparieren {$batch copy "xx x.exe" "c:xx x.exe"}
ist nicht möglich. ich habe teilweise leerzeichen in den dateinamen bzw. pfadnamen. gibt es dafür eine lösung ?
3. KompilierenMarkierenSeparieren includedateien werden ohne pfadangabe nicht gefunden, wenn sich die programmdatei in einem anderen verzeichnis befindet als XPSE. m:ehbeinxprofan - XPSE und compiler m:ehbeinxprofaninclude - z.b. debugprint.inc m:ehbeinxprofanprojekteest - z.b. xxx.prf
ich benutze XPSE seit einiger zeit zu fast 100%. neben den Compileroptionen die die arbeit erleichtern und beschleunigen, ist die .enh-datei das genialste. zu jeder programmversion die im einsatz ist hebe ich mir die entsprechende .enh-datei auf. fehlermeldungen die sich auf eine zeilennummer beziehen, lassen sich so genial einfach finden.
toll daß es XPSE gibt
r.r. |
| | | | |
| | | | - Seite 2 - |
| | CB | ExceptionEAccessViolation im Modul profan.exe bei ... Meintet Ihr das oder ist das ein anderer Fehler? (Habe jetzt alle ^ im aktuellen Code rausgenommen)
Gruß, Christian |
| | | | |
| | | [quote:7bc750c6e8=Christian Bernfeld]ExceptionEAccessViolation im Modul profan.exe bei ... Meintet Ihr das oder ist das ein anderer Fehler? (Habe jetzt alle ^ im aktuellen Code rausgenommen)
Gruß, Christian[/quote:7bc750c6e8]Im Modul Profan.exe? Das hätte dann nix mit dem XPSE mehr zu tun. Aus dem Code den Du mir PMt hast habe ich einfach alle ^ herausgenommen - und xpse hat sich nicht mehr beschwert. Den Bug werde ich aber natürlich entfernen.
Was läuft da jetzt bei Dir falsch?
Das mit den Assemblerblöcken ist was anderes - mit Franks XPIA im Zusammenhang mit dem XPSE kann man reines Assembler im Profansource anwenden - ich glaube aber du hast keine ASM-Passagen drin.
Salve, iF |
| | | | |
| | Frank Abbing | Hi,
es sieht wohl so aus, als würde XPSE den Code wieder und wieder durchsuchen. Hört gar nicht mehr damit auf, erzeugt aber keinen Fehler. |
| | | | |
| | | Aha - ich hatte was anderes Bemerkt - kannst Du mir dein Codepiece geben?
Salve, iF |
| | | | |
| | Frank Abbing | Hier ist er: KompilierenMarkierenSeparierenIn diesem Democode befinden sich zwei Assemblerblöcke.
Eine versteckt sich in einer Profan-Prozedure und lädt eine Datei via API. Das ginge auch mittels Profan,
aber das hier ist ja ein Democode.
Der andere Assemblerblock zählt nach, wie oft die einzelnen Buchstaben (A-Z, bzw. a-z) in einer
Textdatei vorkommen.
{$cleq}
Declare x&,y&,z&,text$,text#,tabelle#,bytes&
Prozedure mit Assemblerblock.
ReadFile dateiname$, Speicher wohin die Datei geladen werden soll, Offset im Speicher, Grösse der Datei
Proc ReadFile
Parameters a1$,a2&,a3&,a4&
ASM Block
AsmStart ReadFileFast
Parameters addr(a1$),a2&,a3&,a4&
Return a3&
jmp @F ;Datenblock überspringen. @F/@@: ist eine Sondervariable genau für diesen Zweck. Kann in
;einem Block auch mehrmals verwendet werden.
readed dd 0
handle dd 0
@@:
invoke CreateFile,para1,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov handle,eax
.if eax>0
mov eax,para2
add eax,para3
invoke ReadFile,handle,eax,para4,addr readed,0
invoke CloseHandle,handle
mov eax,readed
.endif
AsmEnd
ASM Block Ende
Return a3&
EndProc
Window 0,0-%maxx,%maxy
CLS
text$=@LoadFile$("Lade eine Textdatei","*.TXT")
x&=@FileSize(text$)
If x&>0
Print text$
Print Str$(x&)+" Bytes geladen."
Print
Print "Anzahl Buchstaben, die im Text gefunden wurden:"
Dim text#,x&+1
ReadFile text$,text#,0,x&
x&=@&(0)
bytes&=x&
If x&
Dim tabelle#,108 26 x 4 + 4
Clear tabelle#
ASM Block
AsmStart Count
Parameters text#,tabelle#,x&
invoke CharUpperBuff,para1,para3
mov ecx,para3
mov ebx,para1
mov edx,para2
.repeat
mov eax,0
mov al,[ebx]
inc ebx ;ebx um 1 erhöhen
.if (al>=65) && (al<=90)
sub eax,65
shl eax,2 ;logisches Verschieben der Bits nach links. Bewirkt: eax * 4. Schneller als "mul"
add eax,edx
mov edi,1
add [eax],edi
.endif
dec ecx
.until ecx==0
AsmEnd
ASM Block Ende
Decimals 2
y&=0
Whileloop 26
x&=Long(tabelle#,y&*4)
Print Chr$(y&+97)+" oder "+Chr$(y&+65)+" = "+Str$(x&)+" x."
y&=y&+1
EndWhile
Dispose tabelle#
EndIf
Dispose text#
EndIf
WaitInput
End
Dieser Code produziert einen Anwendungsfehler: KompilierenMarkierenSeparieren {$cleq}
Declare text$,passwort$,nurso$
text$="Zunächst einmal: Für Assembler benötigt man keine grosse Anzahl von Befehlen, mit 10 Befehlen "
text$=text$+"(insgesamt gibt es über 90) ist man schon gut bedient, alles andere ist unnütz, weil der "
text$=text$+"MASM32 Assembler High-Level-Syntax (.while / .endw / .if / .endif usw.) unterstützt."
text$=text$+"Und davon ist einem Profan-User schon das meiste bekannt."
passwort$="Ganz geheimes Passwort."
CLS
Print "Originaltext:"
Print
Color 7,15
Print text$
Color 0,15
Print
Print
ASM-Block
Crypt(), eine XOR-Verschlüsselung mittels Passwort
Übernommen aus meiner ProSpeed.dll
Parameter:
1) Bereichsvariable oder String, in der die Daten gespeichert sind.
2) Anzahl zu verschlüsselnder Bytes
3) Pointer auf einen String (oder Bereich), in dem das Passwort gespeichert ist
4) Länge des Passworts
Beim zweiten Aufruf mit den gleichen Parametern wird der ursprung wieder hergestellt.
AsmStart Crypt
Parameters addr(text$),Len(text$),addr(passwort$),Len(passwort$)
mov ecx,para2
mov edx,para1
mov ebx,para3
mov esi,para4
mov edi,0
schleife:
mov al,[edx]
xor al,[ebx+edi]
mov [edx],al
inc edx
inc edi
cmp esi,edi
jne sprung
mov edi,0
sprung:
sub ecx,1
jne schleife
AsmEnd
Print "Verschlüsselter Text:"
Print
Color 7,15
Print text$
Color 0,15
Print
Print
Jetzt kommt eine Besonderheit...
Wir rufen unseren ersten ASM-Block ein zweites mal auf !!! Ohne Prozedure !
xpia$ ist der Name unserer kompletten Assemblerlibrary.
Crypt ist hier der Name des Assemblerblocks, danach folgen etventuelle Parameter.
Dabei ist es sogar egal, ob der zweite Aufruf nach dem Assemblerblock erfolgt oder schon davor !
Wer das jetzt nicht verstanden hat, der sollte den ASM-Block Crypt lieber in eine Profan-Prozedure
packen, und stattdessen lieber die Prozedure aufrufen. Aber so geht es auch.
External(xpia$,"Crypt",addr(text$),Len(text$),addr(passwort$),Len(passwort$))
Print "Und der wieder hergestellte Text:"
Print
Color 7,15
Print text$
WaitInput
End
Dieser hier produziert: Befehl unbekannt: While KompilierenMarkierenSeparieren Anwendungsfehler: KompilierenMarkierenSeparieren {$cleq}
Declare sum&,bereich#,text$
Cls
If 0
AsmStart Checksumme
Parameters addr(text$),Len(text$)
mov ebx,para1
mov esi,para2
xor ecx,ecx
xor edx,edx
xor eax,eax
.if esi>=0
schleife:
mov al,[ebx]
add edx,eax
add edx,ecx
rol edx,8
inc ecx
inc ebx
cmp ecx,esi
jne schleife
.endif
mov eax,edx
AsmEnd
EndIf
text$="Probestring. Man könnte auch einen Bereich angeben."
Print External(xpia$,"Checksumme",addr(text$),Len(text$))
text$="Probestring. Man könnte auch einen Bereich angeben"
Print External(xpia$,"Checksumme",addr(text$),Len(text$))
text$=" Probestring. Man könnte auch einen Bereich angeben."
Print External(xpia$,"Checksumme",addr(text$),Len(text$))
text$="Probestring. Mbn könnte auch einen Bereich angeben."
Print External(xpia$,"Checksumme",addr(text$),Len(text$))
text$="Probestring. Man könnte auch einen Bdreich angeben."
Print External(xpia$,"Checksumme",addr(text$),Len(text$))
Print
Dim bereich#,1000000
Clear bereich#
Print External(xpia$,"Checksumme",bereich#,1000000)
Byte bereich#,100=1
Print External(xpia$,"Checksumme",bereich#,1000000)
Dispose bereich#
WaitInput
End
Usw... |
| | | | |
| | Frank Abbing | Nochmal ich,
sorry, hatte mit einer nicht mehr aktuellen Version getestet. Die meißten Codes laufen jetzt. Mindestens ein Code erzeugt aber nach wie vor einen Fehler: KompilierenMarkierenSeparieren {$cleq}
Declare dh&,text$,x&,y&,z&
{$replace 1:"_Schleifen_enh"}
Def Schleife(1) !^1^,"Schleife"
dh&=usedll(xpia$)
CLS
Print xpia$
ASM-Block
If 0
AsmStart Schleife
Parameters x&
mov ecx,para1 ;Unser Parameter, also 100 Millionen
schleife:
dec ecx ;ecx=ecx-1
jnz schleife ;verzweige, wenn das zuletzt benutze Register (also ECX) nicht 0 ist
mov eax,ebx
AsmEnd
Endif
Warten, bis alle Laufwerke aus sind.
Noch aktive Laufwerke verfälschen den Geschwindigkeitstest.
Print
Print "3 Sekunden warten, bis alle Laufwerksaktivitäten versiegt sind."
Print
Sleep 3000
Assemblerschleife, 100 Millionen mal durchlaufen:
Wir benutzen unser generierte Dll im geladenen Zustand, weil allein
Profans Aufruf von "External" 16 Millisekunden für jede Ausführung benötigt...
x&=100000000
Print "Assemblerschleife wird jetzt "+Str$(x&)+" mal durchlaufen."
y&=&GetTickCount
Schleife(x&)
y&=&GetTickCount-y&
Print "Fertig in "+Str$(y&)+" Millisekunden."
Print
Profanschleife, 100 Millionen mal durchlaufen:
x&=100000000
Print "Profanschleife wird jetzt "+Str$(x&)+" mal durchlaufen."
y&=&GetTickCount
Whileloop x&
EndWhile
y&=&GetTickCount-y&
Print "Fertig in "+Str$(y&)+" Millisekunden."
WaitInput
freedll dh&
End
|
| | | | |
| | | Ich habs grade getestet - läuft einwandfrei.
Ich hatte aber glaube vergessen zu erwähnen das Remarks via ; in ASM-Blöcken nicht mehr erlaubt sind. Dies ist die Vorbereitung zur ;-Zeilentrennung.
Vielleicht muddu die *DLL mal entfernen - also bei mir funzt es super jetzt.
Salve, iF |
| | | | |
| | CB | [quote:ec61eef52b=iF][quote:ec61eef52b=Christian Bernfeld]ExceptionEAccessViolation im Modul profan.exe bei ... Meintet Ihr das oder ist das ein anderer Fehler? (Habe jetzt alle ^ im aktuellen Code rausgenommen)
Gruß, Christian[/quote:ec61eef52b]Im Modul Profan.exe? Das hätte dann nix mit dem XPSE mehr zu tun. Aus dem Code den Du mir PMt hast habe ich einfach alle ^ herausgenommen - und xpse hat sich nicht mehr beschwert. Den Bug werde ich aber natürlich entfernen.
Was läuft da jetzt bei Dir falsch?
Das mit den Assemblerblöcken ist was anderes - mit Franks XPIA im Zusammenhang mit dem XPSE kann man reines Assembler im Profansource anwenden - ich glaube aber du hast keine ASM-Passagen drin.
Salve, iF[/quote:ec61eef52b] Nö, mit ASM hab ich (noch) nix am Hut. Das komische ist nur, die .enh wird erstellt, das Prog startet normal, ich gebe eine Pat.-ID ein - Peng. Wenn ich das gleiche über den Ver. 8 Interpreter mache, läufts normal. Jetzt habe ich auch Ver. 9 (die letzte) probiert - da fliege ich auch mit einer Schutzverletzung raus! Sieht fast so aus, als müßte ich Dir ein noch größeres Paket schnüren... Oder hast Du eine andere Idee?
Gruß, Christian |
| | | | |
| | | Kein größeres Packet. Einfach nur den Quellcode + enh. So müsste es gehen.
Aber wenn die P9 schon rausschmeist - ists wohl kein xpse-problem. Ich würde es mir jedoch trotzdem gerne anschauen.
Salve, iF |
| | | | |
| | CB | Ok, kann ich Dir abends von zuhause aus schicken.
Etwas klüger bin ich mittlerweile: Habe in alter Gewohnheit ein paar REM stehengelassen, korr. Aber jetzt meckert der XProfan-Compiler 9: Stringende fehlt bei KompilierenMarkierenSeparieren Any idea?
Gruß, Christian |
| | | | |
| | | Ja - bekannter DefBug vom P9.
Im aktuellen aber noch nicht herausgegebenen Release soll dies behoben sein.
Salve, iF |
| | | | |
| | CB | Habe die Zeile mal testhalber auskommentiert, dann lief der Compilierungsprozeß durch, mit XPSE fliege ich aber immer noch aus meinem Prog raus (Interpretermodus)
Ich schick Dir doch mal den Code + Enh, Du findst da sicher schneller den (die)Fehler, obwohl auch der Profan2cpp nix meldet! Mache mich mal auf den Heimweg.
Gruß, Christian |
| | | | |
|
AntwortenThemenoptionen | 23.552 Betrachtungen |
ThemeninformationenDieses Thema hat 8 Teilnehmer: |
|