Thibaud GUERIN writes: > On 4/22/06, Andrew Haley <aph@xxxxxxxxxxx> wrote: > > Thibaud GUERIN writes: > > > On 4/21/06, Andrew Haley <aph@xxxxxxxxxxx> wrote: > > > > Thibaud GUERIN writes: > > > > > > > > > > > > > > OK, so we've got rid of the asms and casting away const, and the code > > > > still doesn't work. > > > > > > > > So, your code is now, at last, legal C. Let's have a look at the > > > > assembly code generated for my_own_printf (use gcc -S). Be sure to > > > > include the exact command line you used. > > > > > my_own_printf: > > > > Args are just below sp. > > > > > pushl %ebp > > > movl %esp, %ebp > > > > ebp points to: frame, retaddr, arg0 > > > > > subl $8, %esp > > > leal 8(%ebp), %eax > > > > eax contains ebp+8: it points to arg0 > > > > > movl %eax, -4(%ebp) > > > > save eax on the stack > > > > > movl -4(%ebp), %eax > > > > restore it > > > > > movl (%eax), %eax > > > > load eax from arg0 > > > > > cmpl 8(%ebp), %eax > > > > compare eax with the memory at ebp+8 > > > > > jne .L33 > > > > So, the memory word at ebp+8 is compared with the memory at ebp+8. > > > > Do you have a debuuger that can single-step through this code, one > > insn at a time? > > Sorry no debugger... this is a part of the 1st program running (well > ... trying to run) Well, we've established that whetever is wrong, it's not the code gcc generates for this routine. It's correct, as you can see. > The only debug ways usable in the code right now are some things like : > i = (long)(fmt); > __asm__ volatile ("mov %0, %%eax\n":: "m"(i)); > __asm__ volatile ("l1: jmp l1"); > > which are really dirty i agree... Thay're also wrong, becasue they don't clobber eax. Andrew.