NASM: Programm wird abgebrochen??

08/10/2009 - 21:28 von Jens Kallup | Report spam
Hallo,

kann mir einer von Euch mal einen Workaround anbieten
und erklàren, warum das Programm beim starten
abgebrochen wird?
Selbst die printf's werden nicht ausgegeben :-(

Gruß
Jens

char* replicate_string(char* input, int len, int count)
{
printf("1111111111111111111111");
char* buf = malloc(len *count);
int i, j, p = 0;
for (i = 0; i < count; i++)
{
for (j = 0; j < len; j++)
{
buf[p] = input[j];
p++;
}
}
printf("22222222222222222");
return buf;
}

char *set_replicate_str(char *s, double v)
{
printf("xasdasdasd");
return replicate_string(s,100,floor(v));
}

BITS 32
cpu 586
segment .text
global _start_main
_start_main:
push ebp
mov ebp, esp
fld qword [LC0]
fstp qword [ebx]
push dword [ebx+4]
push dword [ebx]
push dword LCS1
call _set_replicate_str
push dword eax
push dword LC1
call _printf
add esp, 8
leave
ret
segment .data
LC0: dq 5.0000000000
LCS1: db "o",0
extern _printf, _set_replicate_str
LC1: db "Hallo Welt! ",0
 

Lesen sie die antworten

#1 Markus Wichmann
08/10/2009 - 22:35 | Warnen spam
Jens Kallup () schrieb:
Hallo,

kann mir einer von Euch mal einen Workaround anbieten
und erklàren, warum das Programm beim starten
abgebrochen wird?
Selbst die printf's werden nicht ausgegeben :-(




Debugger existieren!

Gruß
Jens

char* replicate_string(char* input, int len, int count)
{
printf("1111111111111111111111");
char* buf = malloc(len *count);
int i, j, p = 0;
for (i = 0; i < count; i++)
{
for (j = 0; j < len; j++)
{
buf[p] = input[j];
p++;
}
}
printf("22222222222222222");
return buf;
}

char *set_replicate_str(char *s, double v)
{
printf("xasdasdasd");
return replicate_string(s,100,floor(v));
}

BITS 32
cpu 586
segment .text
global _start_main
_start_main:
push ebp
mov ebp, esp
fld qword [LC0]
fstp qword [ebx]



Und ebx=? Wenn das, als Pointer interpretiert, außerhalb deines
Adressbereiches liegt, gibt es hier eine segmentation fault und das
Programm wird gekillt.

Workaround:

sub esp, 8
fstp qword [esp]

push dword [ebx+4]
push dword [ebx]



Das entfàllt dann.

push dword LCS1
call _set_replicate_str



add esp, 12 ;hast du vergessen

push dword eax
push dword LC1
call _printf
add esp, 8
leave
ret
segment .data
LC0: dq 5.0000000000
LCS1: db "o",0
extern _printf, _set_replicate_str
LC1: db "Hallo Welt! ",0




Optimierungsvorschlàge:

fld
fstp

was soll das? Da kanst du das Laden ja gleich bleiben lassen.

add esp, 8
leave

das add kann in diesem Fall weg, weil esp direkt danach eh zurückgesetzt
wird.

HTH,
Markus
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.

Ähnliche fragen