[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