 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
FH Super JLI'ler
Alter: 37 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 27.05.2005, 12:58 Titel: [M-ASM] Problem mit SYSTEMTIME/wsprintf |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 27.05.2005, 13:04 Titel: |
|
|
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 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 |
|
 |
FH Super JLI'ler
Alter: 37 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 27.05.2005, 15:44 Titel: |
|
|
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 |
|
 |
FH Super JLI'ler
Alter: 37 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 27.05.2005, 16:45 Titel: |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 28.05.2005, 05:03 Titel: |
|
|
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 |
|
 |
|
|
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
|