Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
DasLiebeSushi Mini JLI'ler
Alter: 51 Anmeldedatum: 27.08.2005 Beiträge: 3 Wohnort: Flensburg Medaillen: Keine
|
Verfasst am: 27.08.2005, 19:56 Titel: Wert aus einer Tabelle lesen (C++ ASM) |
|
|
Moin =)
Habe hier ein kleines Problem.
Ich will aus einer Tabelle Werte auslesen und bekomme nun die Fehlermeldung "unhandled exceptions..."
hier der code:
Code: |
#define TABELLE_LAENGE 3
unsigned char tabelle[]=
{
0xff,0xff,0xff,0x99,0x99,0x99,0x55,0x55,0x55
};
int read_table();
unsigned char r;
unsigned char g;
unsigned char b;
int counter = 0;
void main(void)
{
read_table();
}
int read_table()
{
__asm
{
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
mov cl,TABELLE_LAENGE
mov ebx,counter
_loop1:
mov al,byte ptr [ebx+tabelle]
mov r,al
inc counter
mov ebx,counter
mov al,byte ptr [ebx+tabelle]
mov g,al
inc counter
mov ebx,counter
mov al,byte ptr [ebx+tabelle]
mov b,al
inc counter
mov ebx,counter
loop _loop1
}
return (r,g,b);
}
|
Diese Routine funktioniert leider nur in einer Consolen Applikation aber nicht in einer Win32 (DirectDraw). Da kommt dann die oben genannte Fehlermeldung.
Im Debugger stoppt er dann bei:
Code: |
mov al,byte ptr [ebx+tabelle]
|
Anweisung "Adresse des obig genannten Befehls" konnte nicht ausgeführt werden.
Ich habe eine Bitmap, die ich auslesen will, als Resource eingebunden.
Wäre für Eure Hilfe echt dankbar. Würde mich auch über eine C++ Routine freuen =). Im Buch steht leider nur wie man mit einem Pointer einen Wert ausliest aber keine Byte Folgen.
Würde mich über jeden Rat oder Code Schnippsel freuen =)
Achja... habe dann noch ein zweites Problem. Sobald ich einen asm Block eröffne (__asm), hängt sich meine VC IDE auf. SP6 ist installiert.
Hat jemand auch dieses Problem ? Das passiert in unregelmässigen Abständen.
Gruss aus Flensburg
DasSushiLiebe (<- 32 Jahre alt und nicht mehr so fit meine Denkmaschine. Bitte drauf achten =)
Zuletzt bearbeitet von DasLiebeSushi am 27.08.2005, 20:17, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 27.08.2005, 20:05 Titel: |
|
|
Hi,
also einen 1D Array kann man ja nicht als Tabelle Bezeichnen Eher als Zeilenvektor.
Aber eine Frage die mich brennend Interessiert: Warum benutzt Du für so eine einfache Operation X86 Assembler? Der Assemblercode der Dein Compiler erzeugt wird mit einer sehr hohen Wahrscheinlichkeit schnelleren generieren als Du es per Hand machen kannst (wenn es keine SIMD-Technologie wie ISSE ist)
Wenn Du uns sagst was die Funktion genau machen soll, dann können wir dir daraus auch gutne Code machen damit dein Compiler noch besseren Assemblercode generieren kann
- Patrick _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
DasLiebeSushi Mini JLI'ler
Alter: 51 Anmeldedatum: 27.08.2005 Beiträge: 3 Wohnort: Flensburg Medaillen: Keine
|
Verfasst am: 27.08.2005, 20:39 Titel: |
|
|
Sorry, aber ich habe seit 1993 keinen Assembler mehr angerührt und unter DOS funzte das alles so wunderbar =).
Wichtig ist mir nur zu wissen, wie ich die Werte oben per Pointer einlese (unter DD ohne unhandled exception) und die dann in eine Variable Speicher.
Hab mir diverse SourceCodes angeguckt (scene.org) aber peil das in C++ nicht. Deshalb bat ich auch um eine kleine Beispiel-Routine wodurch ich das lernen kann.
Würde mich immer noch darüber freuen =).
Gedacht war dieses einfach nur um später mal eine Bitmap in ein Surface zu schreiben (ohne BMP Header) oder für eine kleine Text Plotter Routine oder oder oder =). Will mich mit dem ganzen wieder vertraut machen.
Und das der Code optimiert werden muss ist mir auch klar aber erstmal das warum klären =). Ich weiss das es langsam ist direkt in den VRAM zu schreiben aber das ist mir zur Zeit egal =).
Gruss
DasLiebeSushi |
|
Nach oben |
|
|
knallbunt Mini JLI'ler
Anmeldedatum: 16.08.2005 Beiträge: 7
Medaillen: Keine
|
Verfasst am: 28.08.2005, 00:47 Titel: |
|
|
Code: | unsigned char* ptr = tabelle;
int rgb1 = (*ptr++ << 16 | *ptr++ << 8 | *ptr++);
int rgb2 = (*ptr++ << 16 | *ptr++ << 8 | *ptr++);
int rgb3 = (*ptr++ << 16 | *ptr++ << 8 | *ptr); |
danach sehen die ints folgendermassen aus:
rgb1: 0x00FFFFFF
rgb2: 0x00999999
rgb3: 0x00555555
wenn du die rgb werte lieber in den obersten bits willst (bei rgba) einfach folgendes machen:
Code: | int rgb1 = (*ptr++ << 24 | *ptr++ << 16 | *ptr++ <<8 ); |
meinst du das oder hab ich dich falsch verstanden? |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 28.08.2005, 08:29 Titel: |
|
|
ich würde dafür jedoch nicht mehr int nehmen sondern unsigned long. 1. da int compilerspezifisch ist und 2. da es sowieso keine negativen werte bei Farben gibt
Ergo: unsigned long rocks _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
knallbunt Mini JLI'ler
Anmeldedatum: 16.08.2005 Beiträge: 7
Medaillen: Keine
|
Verfasst am: 28.08.2005, 12:50 Titel: |
|
|
was meinst du mit compilerspezifisch? bei farben benötigt man doch nur 32bit und die 64bit die long auf 64bit architekturen hat sind überflüssig und können unter umständen sogar zu problemen führen. |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 28.08.2005, 12:55 Titel: |
|
|
Bei C++ gillt das Mindestgrößen Prinzip.
int hat eine Mindestgröße von 16 Bit nicht immer von 32. Long hat 32 Bit auf 64 Bit compilern 64 Bit.
Wenn der Datentyp größer ist gibt es keine Probleme, nur wenn er zu klein ist.
Und mit Kompilerspezifisch meine ich das der Compilerhersteller selber definieren kann wie groß er sein soll. Da selbe gilt mit char, wchar_t,short usw. Die Mindestgröße ist wichtig, nicht die reale. Deshalb frisst DD und D3D nur DWORDs(unsigned longs) als Farbdaten. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
knallbunt Mini JLI'ler
Anmeldedatum: 16.08.2005 Beiträge: 7
Medaillen: Keine
|
Verfasst am: 28.08.2005, 13:15 Titel: |
|
|
da hast du recht. ist aber wohl relativ egal bei den meisten aktuellen compilern was man nimmt, int ist ja meistens 32bit. |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 28.08.2005, 13:22 Titel: |
|
|
bei den meisten, aber darauf sollte man nicht aufbauen. nebenbei: int mit 32 bit ist jedoch 16 bit negativ und 16 bit positiv. ergo: 16 bit in deinem fall. es sei denn du nimmst unsigned um 32 positiv zu bekommen. Da farben nie negative werte haben können, sollte dies hier angewendet werden.
und long? natürlich ebenfalls zu der kompatibilität zu directdraw. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
knallbunt Mini JLI'ler
Anmeldedatum: 16.08.2005 Beiträge: 7
Medaillen: Keine
|
Verfasst am: 28.08.2005, 13:28 Titel: |
|
|
in diesem fall macht es keinen unterschied ob man unsigned oder signed int verwendet.man betrachtet ja nicht die zahl die der int repräsentiert sondern ist nur an den bit folgen intressiert und die sind in jedem fall gleich. |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 28.08.2005, 13:28 Titel: |
|
|
Zitat: |
16 bit negativ und 16 bit positiv
|
Hä? Für negativ/postiv wird doch nur 1 Bit benötigt? _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
DasLiebeSushi Mini JLI'ler
Alter: 51 Anmeldedatum: 27.08.2005 Beiträge: 3 Wohnort: Flensburg Medaillen: Keine
|
Verfasst am: 28.08.2005, 13:35 Titel: |
|
|
knallbunt hat Folgendes geschrieben: |
meinst du das oder hab ich dich falsch verstanden? |
Moin =)
Vielen Dank... das wird mir weiterhelfen.
Hab leider zur Zeit kein Internet und muss immer quer durch die Stadt rennen um mal was nach zu lesen =(.
Nun ist der Sonntag aber gerettet und ich komme jetzt weiter =)
Danke nochmal
Gruss
DasSushiLiebe |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 28.08.2005, 13:36 Titel: |
|
|
das stimmt schon, aber die reichweite ist dann nur 16 bit.
Beispiel für int mit mindestwerte: –32,768 bis 32,767
mit unsigned : 2,147,483,648 _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
knallbunt Mini JLI'ler
Anmeldedatum: 16.08.2005 Beiträge: 7
Medaillen: Keine
|
Verfasst am: 28.08.2005, 13:46 Titel: |
|
|
man hat - 2^31 bis 2^31 - 1 bei signed int
und 0 bis 2^32 - 1 bei unsigned int
ich glaube du verweckselt das gerade mit den 16bit indizes bei directx |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
|