hi,
I'm actually writing a program in C and i'm fighting with an address
dereferencing since some days now.

The program run on a non *n*x system and I can't produce the error on
my linux system so i can only describe it... sorry.

In my system depending if i (un)comment the commented lines in the
next code, the 1st or the 2nd string is printed.
uncommented -> pointers are the same
commented -> pointers aren't the same

I'm compiling with (to run on my VM):
-std=gnu99 -Wall -Werror -nostdinc -Wstrict-aliasing=2 -fno-builtin 
-I../include -I../
and (on linux):
-std=gnu99 -Wall -Werror  -Wstrict-aliasing=2
ggc version : gcc (GCC)  3.4.6
GNU assembler 2.16.1

the linkage is a bit different too as my binary is neither ELF nor a.out ...

The asm inline part was a way to escape the problem as the compiled
asm wasn't working...
 But after that "patch" an incrementation of "ap" : ap++; after the
assignation wasn't working and in the asm code the increment wasn't on
the good (register+offset)/address so ...

the code :


int            the_bug(const char *fmt, ...)
{
  char    **ap;
  char        **s = (char **)(&fmt);

/* __asm__ volatile ( */
/*           "\tleal %1, %%eax\n" */
/*           "\tmovl %%eax,%0\n" */
/*           "\tmovl %1, %%eax\n" */
/*           "\tmovl %2, %%ebx \n" */
/*           "\tmovl %%eax, (%%ebx)\n" */
/*           : "=m"(ap) : "m" (fmt), "m"(ap)); */

 if (*s == (char *)fmt)
   write(1, "they are the same\n", 18);
 else
   write(1, "they aren't the same\n", 21);

  return (0);
}


the ASM generated (uncommented and commented)
(as shown in biew (->objdump doesn't work because of the "not ELF format")) :

push            bp                                           | push   
        bp
mov              bp, sp                                     | mov     
        bp, sp
sub (w)         sp, +08                                   | sub (w)   
     sp, +08
lea                ax, [di+08]                             | lea      
         ax, [di+08]
mov              [di-08], ax                               | mov      
       [di-08], ax
lea                ax, [di+08]                             |
 mov              [di-04], ax                              |
 mov               ax, [di+08]                            |
mov              bx, [di-04]                               |
mov              [bp+di], ax                              |
 mov               ax, [di-08]                             | mov      
        ax, [di-08]
 mov               ax, [bx+si]                             | mov      
        ax, [bx+si]
cmp               ax, [di+08]                             | cmp       
       ax, [di+08]
  jne                file:000029B4              DIFF   | jne          
     file:000029A6
sub (w)          sp, +04                                  | sub (w)   
      sp, +04
push (w)        +0D                                       | push (w)        +0D
push (w)        3AA8                                     | push (w)        3AA8
add              [bx+si], al                               | add      
       [bx+si], al
push (w)        01                                          | push (w)
       01
calln             file:0000295D                         | calln       
     file:0000295D
??? (w)         di                                            | ???
(w)         di
add (w)        sp, +10                                    | add (w)   
    sp, +10
jmps            file:000029C8                DIFF   | jmps           
file:000029BA
sub (w)          sp, +04                                  | sub (w)   
      sp, +04
 push (w)        +10                                       |  push (w)
       +10
 push (w)        3AB6                                    |  push (w)        3AB6
 add              [bx+si], al                              |  add     
        [bx+si], al
 push (w)        01                                         |  push
(w)        01
 calln             file:0000295D                        | calln       
     file:0000295D
 ??? (w)         di                                          |  ???
(w)         di
 add (w)        sp, +10                                  |  add (w)   
    sp, +10
 mov               ax, 0000                              | mov        
      ax, 0000
  add              [bx+si], al                             |  add     
        [bx+si], al
leave                                                          | leave
retn                                                             | retn


If anyone has an idea... to reproduce the error, ..... or (better :))
correct it...

--
Thibaud

Reply via email to