Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

ASM-Routine für Pixelabfrage geht nicht richtig

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 01.08.2009, 09:21    Titel: ASM-Routine für Pixelabfrage geht nicht richtig Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 01.08.2009, 15:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 01.08.2009, 15:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 01.08.2009, 18:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 01.08.2009, 22:52    Titel: Antworten mit Zitat

Jup, danke für deine Hilfe.
Das Compilat von freebasic ist schon sehr schnell. hatte ich nicht gedacht.

mf
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz