[linux] Kde je chyba v asm kode

peter Fodrek fodrek na kasr.elf.stuba.sk
Čtvrtek Červenec 24 09:46:30 CEST 2003


Caute!

Dostal sa mi do ruk kod,ktory ide skomilovat no v case ked zavola funkciu cableputline tak na vyznacenom mieste vyhlasi sgemetation fault - bez tohto kodu program nefunguje- t.j. nerobi co ma... Kedze mi C-cko sveci podstatne viac ako assembler, dovolujem si opytta sa Vas, ci neviet v com je problem? Ja tam vidim jedine riziko pretecenie esi.. Alebo je to nieco ine...

Vdaka za kazdu radu

Peto

P.S. tu je kod, co mi nebezi na Mandarke 9 s gcc verzie 3.2 na Celeron 1,2Ghz s 100Mhz FSB...

void cableputline(unsigned char *membase, unsigned char *surface)

{

unsigned char linebuf[2048];

unsigned char lumabuf[2048];

int polarity = 0;

fprintf(stderr,"som v cable put line\n");

__asm__ __volatile__ ("pushl %ebx\n"

"pushl %esi\n"

"pushl %edi");

fprintf(stderr,"po push-och\n");


__asm__ __volatile__ ("movl %0, %%esi" : : "m" (membase));

fprintf(stderr,"po mov 1\n");


__asm__ __volatile__ ("xorl %edx, %edx\n"

"xorl %eax, %eax\n"

"movl $32, %ecx");

fprintf(stderr,"po mov 2\n");

/* v nasledujucom useku amd kodu je chyba  sposobujuca segmetation fault*/

__asm__ __volatile__ ("__detectburst:\n"

"movb (%esi), %al\n"

"incl %esi\n"

"addl %eax, %edx\n"

"decl %ecx\n"

"jnz __detectburst\n"

"movl $0x500, %eax\n"

"subl %edx, %eax\n"

"sarl $4, %eax\n"

"pushl %eax\n"

"addl $64, %esi");

fprintf(stderr,"po mov 3\n");


__asm__ __volatile__ ("movl %0, %%edi" : : "m" (lumabuf));

fprintf(stderr,"po Lumabuf\n");


__asm__ __volatile__ ("pushl %edi"); /* -O2 workaround */

fprintf(stderr,"po push");


__asm__ __volatile__ ("movl $1872, %ecx");

__asm__ __volatile__ ("__luma_filter1_loop:\n"

"xorl %eax, %eax\n"

"xorl %edx, %edx\n"

"movb (%esi), %al\n"

"movb 4(%esi), %dl\n"

"incl %esi\n"

"addl %edx, %eax\n"

"movb %al, (%edi)\n"

"incl %edi\n"

"decl %ecx\n"

"jnz __luma_filter1_loop\n");


__asm__ __volatile__ ("popl %esi"); /* -O2 workaround */


__asm__ __volatile__ ("popl %ebx\n"

"movl $357, %ecx\n");


/* __asm__ __volatile__ ("movl %0, %%esi" : : "m" (lumabuf)); */

__asm__ __volatile__ ("movl %0, %%edi" : : "m" (linebuf));


__asm__ __volatile__ ("pushl %edi"); /* -O2 workaround */

__asm__ __volatile__ ("__luma_filter2_loop:\n"

"xorl %edx, %edx\n"

"xorl %eax, %eax\n");

__asm__ __volatile__ ("movb 2(%esi), %dl\n");

__asm__ __volatile__ ("movb 1(%esi), %al\n");

__asm__ __volatile__ ("addl %eax, %edx\n"

"movb 3(%esi), %al\n"

"addl %eax, %edx\n"

"addl %edx, %edx\n"

"movb (%esi), %al\n"

"addl %eax, %edx\n"

"movb 4(%esi), %al\n"

"addl %edx, %eax\n"

"sarl $1, %edx\n"

"addl %ebx, %edx\n"

"sarl $1, %edx");

__asm__ __volatile__ ("movl %0, %%eax" : : "m" (polarity));

__asm__ __volatile__ ("addl $5, %esi\n"

"orl %eax, %eax\n"

"jz __nopolarity\n"

"negl %edx\n"

"addl $210, %edx");

__asm__ __volatile__ ("__nopolarity:\n"

"cmpl $256, %edx\n" 

"jl __nocliphigh\n"

"movl $255, %edx\n"

"jmp __nocliplow");


__asm__ __volatile__ ("__nocliphigh:\n"

"cmpl $0, %edx\n"

"jge __nocliplow\n"

"movl $0, %edx");

__asm__ __volatile__ ("__nocliplow:\n"

"movb %dl, (%edi)\n"

"incl %edi\n"

"decl %ecx\n"

"jnz __luma_filter2_loop");

__asm__ __volatile__ ("movl %0, %%edi" : : "m" (surface));

__asm__ __volatile__ ("movl $357, %ecx");


/* __asm__ __volatile__ ("movl %0, %%esi" : : "m" (linebuf)); */

__asm__ __volatile__ ("popl %esi"); /* -O2 workaround */


__asm__ __volatile__ ("xorl %ebx, %ebx");


__asm__ __volatile__ ("__display_rgb8_loop:\n"

"pushl %edx\n"

"xorl %edx, %edx\n"

"xorl %eax, %eax\n"

"movb (%esi, %ebx), %al\n"

"shrb $3, %al\n"

"addw %ax, %dx\n"

"shlw $5, %dx\n"

"addw %ax, %dx\n"

"shlw $6, %dx\n"

"addw %ax, %dx\n"

"movw %dx, (%edi,%ebx,2)\n"

"popl %edx\n"

"incl %ebx\n"

"decl %ecx\n"

"jnz __display_rgb8_loop\n"

"popl %edi\n"

"popl %esi\n"

"popl %ebx");

}
------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://lists.linux.sk/pipermail/linux/attachments/20030724/1e7a922c/attachment.html 


Další informace o konferenci linux