Programm gibt merkwürdige Zeichen aus bei @strfmt printf ...

13/07/2010 - 21:48 von Jens Kallup | Report spam
Hallo,

neues Problemchen: siehe Topic: code hier ...
http://codepad.org/vdJUSfQc

irgendwas stimmt da noch nicht ...
Jens
 

Lesen sie die antworten

#1 Jan Seiffert
14/07/2010 - 00:40 | Warnen spam
Jens Kallup schrieb:
Hallo,

neues Problemchen: siehe Topic: code hier ...
http://codepad.org/vdJUSfQc

irgendwas stimmt da noch nicht ...

L52:
fld qword [_i]
fstp qword [esp]
; prüfen ob Daten stimmen ...
mov dword eax, [_aalpha_AsmArrayListe]
mov dword ebx, [eax + 0 * 16 + 0]



Du laedst _immer_ das 0-te Array Element

cmp ebx, 1 ; if expr?
jnz near Lb52




Darum ist der typ nicht 1 und du springst hier _immer_ nach Lb52

mov dword eax, [_aalpha_AsmArrayListe]
mov dword ecx, eax
mov edx, 0
shl edx, 4
add ebx, edx



ebx ist "nicht initialisiert".
Es enthaelt zufaellig den letzten typ, der in diesem konkreten fall immer 2 ist

add ebx, 8




Das ergebniss ist immer irgendwie 2 + 0 << 4 + 8


mov dword eax, [_aalpha_AsmArrayListe]
mov dword ecx, eax
mov edx, 0
shl edx, 4
add ecx, edx
add ecx, 12




hier hast du den Fehler nicht gemacht, aber das ist nicht das was du aus dem
array laden willst, sondern einfach base_ptr + 0 << 4 + 12

mov dword [_varr_expr ], ebx
mov dword [_varr_expr +4], ebx



hier speicherst du zwei mal ebx? Also _zufaellig_ 2 * 8, also:
0x000000080000008

mov dword [_varr_vartype], 1
jmp near Lb53
Lb52:
mov dword eax, [_aalpha_AsmArrayListe]
mov dword ecx, eax
mov edx, 0
shl edx, 4
add ecx, edx
add ecx, 8



du "berechnest" den pointer auf das 0-te array element, in dem fall ein pointer
auf ein array aus chars, dereferenzierst ihn aber nicht.


; mov dword ebx, [eax + 0 * 16 + 8]
mov dword [_varr_string], ecx



speicherst diesen errechneten pointer auf pointer in _varr_string

mov dword [_varr_vartype], 2



forced _varr_vartype auf zwei

Lb53:
L53:
fld qword [_i]
fld QWord [LC89]
faddp
fstp QWord [_i]
cmp dword [_varr_vartype], 1
jnz near Lb55



so das du hier nach Lb55 springst

fld qword [_varr_expr]
fstp qword [esp]
push @dblfmt ; "%g"
call _printf
add esp, 12
jmp Lb56
Lb55:
push dword _varr_string



wo du jetzt den pointer auf den pointer auf den pointer auf das array aus chars
auf den stack tust.
Also:
char ***str;

Super, du hast grad den Status des "Three-star-programmer" erreicht. Womit du
aber anscheinend nicht umgehen kannst.

push @strfmt ; "%s"



Denn %s will "char *".
Deshalb kann das hier auch nicht das richtige ausgeben.

call _printf
add esp, 8


[snip]

Jens



Gruss
Jan

PS: Aus dem letzten Post...
Nebenbei: Vielleicht willst du dich noch mal mit Programmiergrundlagen
beschaeftigen.
Ich habe gesehen du wirfst recht haeufig Pointer und ihr Ziel (pointee)
durcheinander (Pointer haben ein Ziel und gleichzeitig selber einen Wert, man
kann jetzt das eine oder das andere manipulieren,



!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
man sollte darauf achten was man grade manipuliert).


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ob es nun Klammern in Eckig oder Rund sind oder Sternchen und "->", der Kram ist
nicht zum Spass da. In Hochsprachen oder ASM. "Do what i mean" gibt es leider nicht.



Elwood: It's 106 miles to Chicago, we got a full tank of gas,
half a pack of cigarettes, it's dark, and we're wearing sunglasses.
Jake: Hit it.

Ähnliche fragen