JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[M-ASM] Problem mit SYSTEMTIME/wsprintf

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
FH
Super JLI'ler


Alter: 37
Anmeldedatum: 16.10.2004
Beiträge: 438

Medaillen: Keine

BeitragVerfasst am: 27.05.2005, 12:58    Titel: [M-ASM] Problem mit SYSTEMTIME/wsprintf Antworten mit Zitat

Folgender Code erzeugt eine total unsinnige Ausgabe:
Code:
.data
TEMP            db "Test",0
RohText         db "%u . %u . %u  %u : %u",0Dh,0Ah,0

.data?
hMemory   HANDLE      ?
pMemory   DWORD       ?
Time         SYSTEMTIME<>

.const
MEMSIZE   equ  20

.code
invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE
mov hMemory,eax
invoke GlobalLock,hMemory
mov pMemory,eax

invoke GetLocalTime,ADDR Time
invoke wsprintf,pMemory,ADDR RohText,Time.wDay,Time.wMonth,Time.wYear,Time.wHour,Time.wMinute

invoke MessageBox,0,pMemory,ADDR TEMP,0
invoke GlobalUnlock,pMemory
invoke GlobalFree,hMemory


Ausgabe:
Code:
27 . 327680 . 0  2005 : 851968

Danach stürtzt das Progarmm beim Aufruf von GloabFree mit folgenden Werten ab:
Code:
TestProgramm verursachte einen Fehler durch eine ungültige Seite
in Modul KERNEL32.DLL bei 0187:bff7a138.
Register:
EAX=003a2034 CS=0187 EIP=bff7a138 EFLGS=00010216
EBX=00510024 SS=018f ESP=0063fd92 EBP=0063fdc6
ECX=39313538 DS=018f ESI=00510008 FS=3b2f
EDX=0a0d3836 ES=018f EDI=003a2050 GS=0000
Bytes bei CS:EIP:
89 51 08 8b 53 08 8b 43 04 89 42 04 8d 93 0b 10
Stapelwerte:
0063fdc6 00510008 00410000 00024c30 bff7b31d 00410000 00510008 0000001c 00000200 00000000 0051091a 00024c30 00510008 0063fe0e bff7b934 00410000

Noch eine Anmerkung: Wenn ich den Aufruf von wsprintf nicht ausführe, stürtzt es nicht ab. Und wenn ich nur beim RohText das 0Dh und 0Ah wegnehme, stürtzt er auch ab und produziert eine falsche Ausgabe.
Ich find den Fehler net... Ich glaube, er stürtzt ab, weil das wsprintf über seinen erlaubten Speicherberich hinaus schreibt.
Gruß

FH
_________________
goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free
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.05.2005, 13:04    Titel: Antworten mit Zitat

Frage am Rande: Wieso schreibst Du in Assembler?

Achja:
CPP:
char buffer[2];
sprintf(buffer, "Hallo ich bin viel zu lang");

Kann sprintf genau so gut wie wsprintf Wink Es wird über den speicher hinaus geschrieben.
_________________
'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
FH
Super JLI'ler


Alter: 37
Anmeldedatum: 16.10.2004
Beiträge: 438

Medaillen: Keine

BeitragVerfasst am: 27.05.2005, 15:44    Titel: Antworten mit Zitat

Und wie erklärst du dir die sehr merkwürdige Ausgabe?
Gruß

FH
<edit>
Und am überschreiben liegts auch net! Selbst wenn ich eine Größe von 1000 angebe, stürtzt er ab und hat ne komische Ausgabe.
</edit>
_________________
goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
FH
Super JLI'ler


Alter: 37
Anmeldedatum: 16.10.2004
Beiträge: 438

Medaillen: Keine

BeitragVerfasst am: 27.05.2005, 16:45    Titel: Antworten mit Zitat

Ich hab zwar keine Ahnung, wieso, aber so gehts:
Code:
invoke GetLocalTime,ADDR Time


mov eax,0

mov ax,Time.wMinute
push eax

mov ax,Time.wHour
push eax

mov ax,Time.wYear
push eax

mov ax,Time.wMonth
push eax

mov ax,Time.wDay
push eax

push OFFSET RohText
push pMemory
call wsprintf

ich denke mal, er hat ein Problem damit, dass die Member von SYSTEMTIME nur ein WORD sind.
Gruß und trotzdem danke

FH
_________________
goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free
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.05.2005, 05:03    Titel: Antworten mit Zitat

Ach jetzt kapier ich erst was Dein Problem ist! (Nach 2 Wiskey)

CPP:
RohText         db "%u . %u . %u  %u : %u",0Dh,0Ah,0

Das geht nicht. Der Compiler kann damit nichts anfangen.
_________________
'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
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.


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

Impressum