[ASM] Zugriff auf GlobalAlloc's erstellten Speicherbereich?

madmax55

Cadet 4th Year
Registriert
Dez. 2004
Beiträge
116
Sers,
bin gernade dabei ein programm in Assembler (MASM) zu schreiben, dass ein bitmap einliest und auswertet, also muss ich auf jeden einzelnen pixel zugreifen können :D
zuerst hab ich die datei eingelesen, größe bestimmt und in den ram geladen. soweit so gut...
nun zu meinem problem: wie kann ich auf den speicherbereich zugreifen, den pointer hab ich, nur iss der ein DWORD?? da kann ich ja nur auf 64K zugreifen? und mit welchen befehlen kann ich auf jedes einzelne byte des speicherbereichs zugreifen?

hier ein ausschnit aus meinem code:
PHP:
        invoke CreateFile,ADDR pathCaptureBitmap,\
                                GENERIC_READ,\
                                FILE_SHARE_READ,\
                                NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,\
                                NULL
                mov hFile,eax
                invoke GetFileSize,hFile,NULL
                mov maxSize,eax
                invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,maxSize
                mov hMemory,eax
                invoke GlobalLock,hMemory
                mov pMemory,eax
                invoke ReadFile,hFile,pMemory,maxSize,ADDR SizeReadWrite,NULL
                invoke Sleep,200
                ;push dword ptr [pMemory]
                mov eax,[pMemory] ; geht das so? um die ersten 4 byte auszulesen.
                mov dtest,eax

schonmal thx
PS: hab mind. 4 stunden im inet rungekramt un nix nützliches gefunden...
 
Zuletzt bearbeitet:
DWORD == Double Word == 32 Bit, also warum sollen da nur 64K gehen?

MfG

Arnd
 
WAS FÜR EIN FREAK BIST DU das du sowas in assembler schreibst !?!?!? sieh aber doch schon SEHR nach C aus ( wens c ist so wies ausschaut) schreib einfah jedes zeichen (bit) in ein array dann kannste einfach über array[xy] auf jedes einzelne zugreifen

bin allerdings auch seh besoffen also irrtümer nicht ausgeschlossen
 
@Arnd da hab ich wohl was verwchselt :D

@riod das iss auf jeden fall ASM ;)
und ich mach das in ASM weil ich da alle möglichkeiten habe :D
und dass man es leicht debuggen kann ;)

das mit dem DWORD hat sich ja geklärt :D , aber wie greif ich jetzt auf den bereich zu?
so:? push dword ptr pMemory

EDIT: ich habs jetzt :D
un zwar muss man den pointer in ein register laden und dann dword ptr:
PHP:
mov eax,pMemory
push dword ptr [eax]
pop dtest
 
Zuletzt bearbeitet:
Hallo madmax55,

also zwischem Deinem Assemblercode und C ist kein grosser Unterschied mehr, da Du in jeder zweiten Zeile eine Win32 API Funktion aufrufst.

Das Assembler leichter zu debuggen ist sehe ich etwas anders. In C kann man wesentlich übersichtlicheren Code schreiben und hat wenn man denn will auch die Möglichkeit das auf Assemberlebene zu debuggen.

Ich denke mal das Du in C schneller zum Ziel kommst, der Code einfacher lesbar und auch besser wartbar ist.

Was bei Deinem Code fehlt ist die Fehlerbehandlung, was ist wenn das GlobalAlloc fehlschlägt? Und das Sleep sollte doch auch überflüssig sein? In C wäre es das jedenfalls.

Für Windowsprogrammierung machst Du Dir mit Assembler nur unnötig viel Arbeit.

Assembler ist bei hardwarenaher Programmierung oder extremen Performance Problemen sinnvoll. D.h. die Benutzerschnittstelle würde ich in C/C++ schreiben. Manipulationen auf Bildern könnte mann dann in Assembler schreiben. Aber dein handgeschriebener Code wird höchstwahrscheinlich auch nicht schneller sein als die C Variante.

Welche Möglichkeiten die man braucht, bietet denn Assembler mehr als C?

MfG

Arnd
 
hab mich noch nich so arg mit C beschäftigt. vielmehr mit c++. daher weiß ich jetzt nich genau wie C code aussieht, aber die syntax iss doch verschieden oder? (im weiternen programm findest du fast keine API funktionen mehr, hab jetzt schon 32KB quelltext und höchstens 30-40 apis). ja der sleep iss unnötig :D
nun warum ich das nich in C schreibe:
- wie gesagt kenn ich mich nich so aus damit
- möchte gern mit softice debuggen weil ich damit schon etwas erfahrung hab. und wenn ich da dann von C generierten code vor mir habe, komm ich da nich allzuweit...:freak: :freak:
- und gerade bei der funktion die die bitmaps auf gleichheit überprüft ist jeder asm befehl zu viel...da dauert es schon 30sec um ein 40x20 pixel großes bitmap in einem 1280x1024 großen ausfindig zu machen, weil ich auf jeder möglichen position überprüfe ob die pixel übereinstimmen... oder gibt es da ne schnellere möglichkeit?
- zudem wusste ich am anfang nicht dass man in C auch auf die windows api zugreifen kann :D :D

mfg
madmax

EDIT: ich arbeite grade an der gesammten fehlerbehandlung, nur hab ich ein problem: wie kann man eine Zahl in einen String umwandeln? also von hand würde ich es hinbekommen, wenn man auf jedes einzelne bit im register zugreifen kann? oder gibt es da schon fertige funktionen, hab nämlich noch keine gefunden...
 
Zuletzt bearbeitet:
Zahl in einen String?

Du müsstest nur zu dem binären Wert der einzelnen Ziffer den jeweiligen ASCII Wert hinzuaddieren. D.h. z.B. binäre 0 + ASCII Wert von 0=48, usw. für jede Ziffer und am Schluss eine binäre 0 für Stringende anfügen.

Und 30s für eine Suche in einer 1280x1024 Bitmap? Das ist ziemlich lange. Wie suchst du denn? Bzw. auf was für einer CPU läuft das ganze? Es wird sicher lange dauern, sicher auch im Sekundenbereich, aber eine halbe Minute erscheint mir doch sehr lange.

MfG

Arnd
 
jup auf die idee bin ich auch schon gekommen, arbeite grad daran.
zum suchablauf:
ich hab ein screen-shot im bmp format, dazu mehrere kleine bitmaps.
jedes einzelne bitmap soll überprüft werden ob es im screen-shot enhalten ist, dazu wird es an jede denkbare stelle, also 0x0 0x1 0x2 usw. verschoben(natürlich alles auf asm ebene) und überprüft wie viele pixel übereinstimmen. :D und das dauert zwischen 10 und 30 sec bis jetzt, wobei ich schon so viel wie möglich optimiert habe. meine cpu ist ein AMD64 3000 bei 2400 Mhz, der sollte schnell genug sein :D

mfg madmax
 
Wieso überprüfst du alle Pixel der kleinen Bitmap? Die Entscheidung ob die Bitmap an dieser Stelle enthalten ist/war kann man auch mit weniger Vergleichen treffen.

Wenn Du für jedes Pixel immer alle Pixel der kleinen Bitmap vergleichst ist schon klar das das 30s dauert.

MfG

Arnd
 

Ähnliche Themen

Zurück
Oben