JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=7573c5ee8d6076cebf084392d4e74deeMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Wert aus einer Tabelle lesen (C++ ASM)
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 27.08.2005, 19:56    Titel: Wert aus einer Tabelle lesen (C++ ASM) Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 27.08.2005, 20:05    Titel: Antworten mit Zitat

Hi,

also einen 1D Array kann man ja nicht als Tabelle Bezeichnen Wink 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 Smile

- 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DasLiebeSushi
Mini JLI'ler


Alter: 51
Anmeldedatum: 27.08.2005
Beiträge: 3
Wohnort: Flensburg
Medaillen: Keine

BeitragVerfasst am: 27.08.2005, 20:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
knallbunt
Mini JLI'ler



Anmeldedatum: 16.08.2005
Beiträge: 7

Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 00:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 08:29    Titel: Antworten mit Zitat

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 Smile

Ergo: unsigned long rocks Wink
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
knallbunt
Mini JLI'ler



Anmeldedatum: 16.08.2005
Beiträge: 7

Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 12:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 12:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
knallbunt
Mini JLI'ler



Anmeldedatum: 16.08.2005
Beiträge: 7

Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 13:15    Titel: Antworten mit Zitat

da hast du recht. ist aber wohl relativ egal bei den meisten aktuellen compilern was man nimmt, int ist ja meistens 32bit.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 13:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
knallbunt
Mini JLI'ler



Anmeldedatum: 16.08.2005
Beiträge: 7

Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 13:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 13:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DasLiebeSushi
Mini JLI'ler


Alter: 51
Anmeldedatum: 27.08.2005
Beiträge: 3
Wohnort: Flensburg
Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 13:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 13:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
knallbunt
Mini JLI'ler



Anmeldedatum: 16.08.2005
Beiträge: 7

Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 13:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 28.08.2005, 14:01    Titel: Antworten mit Zitat

ich lese nur die aktuelle Data Types Range der MSDN.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_langref_Data_Type_Ranges.asp

Und da int keine fest definierte größe hat sondern nur ein kennzeichen darstellte für eine ganzzahl sollte man davon sowieso langsam etwas abraten.
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum