| |
|
|
| Welche Register müssen hier gesichert werden. Oder wird das von Xpia4 bzw XProfan übernommen das richtige Sichern von Registern?
mfg KompilierenMarkierenSeparieren $MAKE CLE
$H Windows.ph
Declare hwin&,x&,y&,f&,hdcwin&
Window 20,20-200,200
hWin& = Create(Window, %hWnd, Test, 250, 20, 650,500)
hDCWin& = ~GetWindowDC(hWin&)
If 0
AsmStart pset
Parameters hdcwin&,x&,y&,f&
mov ecx,para1
mov eax,para2
mov ebx,para3
mov edi,para4
invoke SetPixel,ecx,eax,ebx,edi
AsmEnd
EndIf
whileloop 0,100,1
x&=&loop
y&=&loop
f&=$ff0000
Call(GetXpiaProcAddress(XpiaModule&,pset),hdcwin&,x&,y&,f&)
endwhile
WaitInput
End
|
|
|
| |
|
|
|
Frank Abbing | Quasi jede API verändert die Register. Wenn du die Daten nach der API wieder benutzen willst, musst du sie vorher auf den Stack pushen und später wieder runternehmen. Oder Variablen verwenden. Welche Register eine API benutzt, ist immer verschieden. Du kannst auch nie ganz sicher sein, dass ein Register nicht verändert wird. Das kann sich bei nächsten Betriebssystem schon geändert haben. Das hier geht übrigens auch: KompilierenMarkierenSeparieren |
|
|
| |
|
|
|
| Jup,danke.
Was macht die Profan2Cpp-Lösung?
mfg |
|
|
| |
|
|
|
Sebastian König | 2peter Bierbach, Beitrag=52367, Zeitpunkt=15.05.2009
Was macht die Profan2Cpp-Lösung?
Frank hat mir vorhin erklärt, was sich bei XPIA geändert hat. Ich werde dann demnächst mein Plug-In daran anpassen. Kann aber etwas dauern, da ich zur Zeit sehr mit anderen Dingen beschäftigt bin...
MfG
Sebastian |
|
|
| |
|
|
|
| Jup, alles klar.
Die erstellten Dll von Xpia4 laufen mit dem Profan2Cpp wunderbar.
Habe jetzt mal 2 Exe erstellt mit XProfan. Einmal mit Asmstart/Asmend und einmal mit der oben erstellten Dll.
Mit Asmstart/Asmend 10200 Zeiteinheiten und das gleiche mit der Dll 4550 Zeiteinheiten. Die Profan2Cpp läuft zur Zeit nur mit der Xpia4-Dll und braucht 4100 Zeiteinheiten.
Mit Dll : KompilierenMarkierenSeparieren $H Windows.ph
DEF createpen(3) ! asm_grafik1.dll,createpen
DEF lineto(3) ! asm_grafik1.dll,lineto
DEF movetoex(3) ! asm_grafik1.dll,movetoex
DEF pset(4) ! asm_grafik1.dll,pset
Declare hwin&,x&,y&,f&,hdcwin&,pstyle&,pwidth&,pcolor&,mypen&,test%
Window 20,20-200,200
hWin& = Create(Window, %hWnd, Test, 250, 20, 650,500)
hDCWin& = ~GetWindowDC(hWin&)
pstyle&=3
pwidth&=0
pcolor&=$ff0000
mypen&=createpen(pstyle&,pwidth&,pcolor&)
~SelectObject( hdcwin&, mypen& )
test%=&GetTickCount
whileloop 1,10000,1
x&=200
y&=200
movetoex(hdcwin&,x&,y&)
x&=400
y&=40
lineto(hdcwin&,x&,y&)
endwhile
Print Str$(Int(&GetTickCount-test%))
WaitInput
End
Ohne Dll: KompilierenMarkierenSeparieren $MAKE CLEI
$H Windows.ph
Declare hwin&,x&,y&,f&,hdcwin&,pstyle&,pwidth&,pcolor&,mypen&,test%
Window 20,20-200,200
hWin& = Create(Window, %hWnd, Test, 250, 20, 650,500)
hDCWin& = ~GetWindowDC(hWin&)
If 0
AsmStart createpen
Parameters pstyle&,pwidth&,pcolor&
invoke CreatePen,para1,para2,para3
AsmEnd(mypen&)
AsmStart movetoex
Parameters hdcwin&,x&,y&
invoke MoveToEx,para1,para2,para3,0
AsmEnd
AsmStart pset
Parameters hdcwin&,x&,y&,f&
invoke SetPixel,para1,para2,para3,para4
AsmEnd
AsmStart lineto
Parameters hdcwin&,x&,y&
invoke LineTo,para1,para2,para3
AsmEnd
EndIf
pstyle&=3
pwidth&=0
pcolor&=$ff0000
mypen&=Call(GetXpiaProcAddress(XpiaModule&,createpen),pstyle&,pwidth&,pcolor&)
~SelectObject( hdcwin&, mypen& )
test%=&GetTickCount
whileloop 1,10000,1
x&=200
y&=200
Call(GetXpiaProcAddress(XpiaModule&,movetoex),hdcwin&,x&,y&)
x&=400
y&=40
Call(GetXpiaProcAddress(XpiaModule&,lineto),hdcwin&,x&,y&)
endwhile
Print Str$(Int(&GetTickCount-test%))
WaitInput
End
mfg |
|
|
| |
|
|
|
Sebastian König | Ist das jetzt nur ein Beispiel oder warum kapselt du diese einfachen API-Aufrufe in DLL-Funktionen? Ich meine, ein einfaches
DEF SetPixel(3) !GDI32,SetPixel usw.
ist doch sicher die effizienteste Lösung...
MfG
Sebastian |
|
|
| |
|
|
|
| ist doch sicher die effizienteste Lösung...
Wird vom Tool, welches bei Xpia4 mit dabei ist, so angefertigt für den Aufruf.
Ist das jetzt nur ein Beispiel oder warum kapselt du diese einfachen API-Aufrufe in DLL-Funktionen?
Die Routinen wurden mal mit invoke über Xpia4 aufgerufen. Ist ein Funktionstest.
mfg |
|
|
| |
|
|
|
Frank Abbing |
ist doch sicher die effizienteste Lösung...
Die effizienteste Lösung ist wohl, auch die Schleife in ASM zu programmieren. |
|
|
| |
|
|
|
| Die effizienteste Lösung ist wohl, auch die Schleife in ASM zu programmieren.
Die Scheife selber ist mit Profan2Cpp schon ein Blitz, wo es ja jetzt wunderbar über dem Aufruf von Xpia4 läuft.
Ich wollte nur mal das wesentliche Testen.
mfg |
|
|
| |
|
|
|
Sebastian König | 2peter Bierbach, Beitrag=52377, Zeitpunkt=16.05.2009
Die effizienteste Lösung ist wohl, auch die Schleife in ASM zu programmieren.
Die Scheife selber ist mit Profan2Cpp schon ein Blitz, wo es ja jetzt wunderbar über dem Aufruf von Xpia4 läuft.
Ich wollte nur mal das wesentliche Testen.
Mir ging es jetzt nur darum, dass man einfache API-Funktionen auch direkt mit DEF bzw. External() verwenden kann - eine Kapselung in einen ASM-Block bringt nur zusätzlichen Overhead mit sich...
MfG
Sebastian |
|
|
| |
|
|