 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 01.08.2009, 09:21 Titel: ASM-Routine für Pixelabfrage geht nicht richtig |
|
|
Hallo brauche mal ASM-Hilfe.
Ich fülle ein Bereich mit einer Farbe, den ich vorher reserviert habe mit "imagecreate".
Funktioniert auch soweit.
Dann wollte ich den Bereich mit einer ASM-Funktion abfragen, ob der Farbwert 250 beträgt, wenn ja soll die ASM-Funktion den Wert 255 ausgeben.
Geht aber nicht so, wie ich mir das vorstelle.
Kann mir ein ASM-Freak mal helfen...Volta?
Danke.
mfg
Code: |
#include "fbgfx.bi"
Declare Function suche() As UByte
OPEN CONS FOR Output AS #1
Screen 18,32
DIM Shared AS BYTE PTR dateiramptr
DIM Shared As BYTE PTR pixelzeiger
Dim Shared As UInteger yy,xx,groesse,merke
Dim Shared As UByte rw,gw,bw
dateiramptr = IMAGECREATE(128, 128, RGB(0,0,0), 32)
pixelzeiger = dateiramptr + Len(FB.IMAGE)
groesse=127*127
ScreenLock
FOR yy = 0 TO 127
FOR xx = 0 TO 127
ASM
mov eax , [pixelzeiger]
mov ebx , 250
mov [eax], ebx
mov ebx , 250
mov [eax+1], ebx
mov ebx , 250
mov [eax+2], ebx
END ASM
pixelzeiger += 4
NEXT
Next
ScreenUnLock
Put (100,100),dateiramptr
pixelzeiger = dateiramptr + Len(FB.IMAGE)
Print #1,suche
GetKey
Function suche() As UByte
Asm
mov eax,[groesse]
mov [merke],eax
mov ecx,0
mov ebx,[pixelzeiger]
l0:
cmp ecx,[merke]
ja ende
mov al,[ebx+ecx]
mov [rw],al
mov al,[ebx+ecx+1]
mov [gw],al
mov al,[ebx+ecx+2]
mov [bw],al
mov al,[bw]
cmp al,250
jbe l1
mov eax,255
jmp ende
l1:
mov al,[gw]
cmp al,250
jbe l2
mov eax,255
jmp ende
l2:
mov al,[rw]
cmp al,250
jbe l3
mov eax,255
jmp ende
l3:
Add ecx,4
jmp l0
ende:
mov [Function], eax
End Asm
End Function
|
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 01.08.2009, 15:31 Titel: |
|
|
Ich habe noch dein erstes Prog genommen!
Code: | Screen 18,32
Dim As UByte Ptr pixelzeiger
Dim As UByte bw,gw,rw
Dim As Integer xx, yy, Zeile = 100, Spalte= 50
Dim As Integer pitch
ScreenInfo ,,,,pitch
PSet (spalte, zeile), &Hff030201 'nur zum testen
pixelzeiger = ScreenPtr + (Zeile *pitch) + (Spalte *4)
'call _fb_GfxScreenPtr@0
'mov ebx, dword ptr [Zeile]
'imul ebx, dword ptr [pitch]
'add eax, ebx
'mov ebx, dword ptr [Spalte]
'sal ebx, 2
'add eax, ebx
'mov dword ptr [pixelzeiger], eax
For yy = 0 To 127
'mov dword ptr [yy], 0
'Label_0B:
For xx = 0 To 127
'mov dword ptr [xx], 0
'Label_0F:
If pixelzeiger[0] <> bw Then ? pixelzeiger[0]'nur zum testen
'mov eax, dword ptr [pixelzeiger]
'movzx ebx, byte ptr [eax]
'movzx eax, byte ptr [bw]
'cmp ebx, eax
'je Label_11
'push 0
'mov eax, dword ptr [pixelzeiger]
'push dword ptr [eax]
'push 0
'call _fb_PrintUByte@12
'Label_11:
If pixelzeiger[1] <> gw Then ? pixelzeiger[1]'nur zum testen
'mov eax, dword ptr [pixelzeiger]
'movzx ebx, byte ptr [eax+1]
'movzx eax, byte ptr [gw]
'cmp ebx, eax
'je Label_13
'push 0
'mov eax, dword ptr [pixelzeiger]
'push dword ptr [eax+1]
'push 0
'call _fb_PrintUByte@12
'Label_13:
If pixelzeiger[2] <> rw Then ? pixelzeiger[2]'nur zum testen
'mov eax, dword ptr [pixelzeiger]
'movzx ebx, byte ptr [eax+2]
'movzx eax, byte ptr [rw]
'cmp ebx, eax
'je Label_15
'push 0
'mov eax, dword ptr [pixelzeiger]
'push dword ptr [eax+2]
'push 0
'call _fb_PrintUByte@12
pixelzeiger = pixelzeiger +4
'Label_15:
'add dword ptr [pixelzeiger], 4
Next
'Label_0D:
'inc dword ptr [xx]
'Label_0C:
'cmp dword ptr [xx], 127
'jle Label_0F
pixelzeiger = pixelzeiger +pitch
'Label_0E:
'mov eax, dword ptr [pitch]
'add dword ptr [pixelzeiger], eax
Next
'Label_09:
'inc dword ptr [yy]
'Label_08:
'cmp dword ptr [yy], 127
'jle Label_0B
Sleep
'Label_0A:
'push -1
'call _fb_Sleep@4 |
der FBC setzt das so gut um, dass ich höchstens 2-5% Speed durch aufwändige Optimierung erreichen könnte!
zum 2 Listing:
groesse=127*127 ??? doch 128*128
mov eax , [pixelzeiger]
mov ebx , 250
mov [eax], ebx <- das sind 4 Byte = ARGB
mov ebx , 250
mov [eax+1], ebx <- schon der nächste Pixel?
pixelzeiger += 4
NEXT
(Hier sollte pixelzeiger eine Zeile tiefer gestellt werden)
Next _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 01.08.2009, 15:55 Titel: |
|
|
Jup, danke für den Hinweis.
Beim ersten hatte sich ein kardinalfehler eingeschlichen:
pixelzeiger = dateiramptr + LEN(FB.IMAGE) <<<< hatte ich vergessen, weil sonst nicht am Anfang anfangen wird zu zählen.
PRINT #1,suche
Würde mich trotzdem mal interessieren, warum die Abfrage nicht korrekt gemacht wird im ASM-Code.
Danke.
mfg |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 01.08.2009, 18:23 Titel: |
|
|
Code: | Function suche(img As Any Ptr) As Integer
Dim As Integer Ptr pixdata
Dim As Integer i, w, h
ImageInfo img, w, h,,, pixdata
'For i = 0 To w*h-1
' If (pixdata[i] And &Hffffff) <> &Hfafafa Then Return 0
'Next
'Return -1
Asm
mov ebx, [pixdata]
mov ecx, [w]
imul ecx, [h]
Label_01:
dec ecx
mov eax, ecx
sal eax, 2
add eax, ebx
mov eax, [eax]
And eax, &Hffffff
cmp eax, &Hfafafa
jne Label_02
or ecx, ecx
jnz Label_01
Xor eax, eax
jmp Label_03
Label_02:
mov eax, -1
Label_03:
mov [Function], eax
End Asm
End Function
Screen 18,32
Dim As Byte Ptr dateiramptr
dateiramptr = ImageCreate(128, 128, RGB(250,250,250))
Put (100,100),dateiramptr
Print suche(dateiramptr)
PSet dateiramptr,(100,100), &HFF030201
Print suche(dateiramptr)
GetKey
|
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 01.08.2009, 22:52 Titel: |
|
|
Jup, danke für deine Hilfe.
Das Compilat von freebasic ist schon sehr schnell. hatte ich nicht gedacht.
mf |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|