C assembleur

coindreauc -  
jisisv Messages postés 3678 Statut Modérateur -
Bonjour

Je fais mes premiers pas en assembleur. Mon problème est que je ne sais pas comment faire le passage de paramètres.
J'ai une fonction main qui appelle une fonction plus, et le passage en paramètre ne fonctionne pas tel que je l'ai fait ici : il n'y a pas les bonnes valeurs dans 8(%ebp) et 12(%ebp). Quelqu'un voit le problème ?

Merci !

---------------------------------------------------------------------------------
.globl main
main:
enter $8, $0
movl $5, -4(%ebp)
movl $7, -8(%ebp)

pushl -4(%ebp)
pushl -8(%ebp)

call plus

addl $8, %esp

leave
ret

---------------------------------------------------------------------------------
.globl plus 
plus:

movl 8(%ebp), %eax
addl 12(%ebp), %eax

leave 
ret

2 réponses

  1. jisisv Messages postés 3678 Statut Modérateur 936
     
    Es-tu certain que ton stack frame est initialisé correct dans la fonction plus
    J'ai essayé ceci:
    johand@osiris:~/src/asm$ cat plus.s 
    .globl plus 
    plus:
    enter 0, 0
    movl 8(%ebp), %eax
    addl 12(%ebp), %eax
    
    leave 
    ret
    johand@osiris:~/src/asm$ as  -g -o plus.o plus.s
    plus.s: Assembler messages:
    plus.s:3: Error: too many memory references for 'enter'
    

    mais cela coince visiblement.

    Regarde ici:
    http://www.unixwiz.net/techtips/win32-callconv-asm.html

    A bientôt.
    Johan
    0
    1. coindreauc
       
      tu as écrit
      enter 0, 0
      . Tu es sur que c'est équivalent à
      enter $0, $0
      ?

      sinon, en lisant, j'ai l'impression d'avoir bien fait les choses.
      0
  2. jisisv Messages postés 3678 Statut Modérateur 936
     
    Tu as raison . J'ai fait de l'assembleur Borland il y a belle lurette.
    enter $0, $0 s'assemble correctement avec l'assembleur Gnu.

    Après linkage et passage sous gdb:
        
    ohand@osiris:~/src/asm$ as -g -o main.o main.s    
    johand@osiris:~/src/asm$ as -g -o plus.o plus.s    
    johand@osiris:~/src/asm$ ld -g -o main main.o plus.o    
    ld: warning: cannot find entry symbol _start; defaulting to 0000000008048054    
    johand@osiris:~/src/asm$ gdb main    
    <cut />    
    (gdb) break 11    
    Breakpoint 1 at 0x804806c: file main.s, line 11.    
    (gdb) run    
    Starting program: /home/johand/src/asm/main     
    
    Breakpoint 1, main () at main.s:11    
    11 call plus    
    (gdb) s    
    plus () at plus.s:3    
    3 enter $0, $0    
    (gdb) s    
    4 movl 8(%ebp), %eax    
    (gdb) s    
    5 addl 12(%ebp), %eax    
    (gdb) s    
    7 leave     
    (gdb) info r    
    eax            0xc 12    
    ecx            0x0 0    
    edx            0x0 0    
    ebx            0x0 0    
    esp            0xbffff294 0xbffff294    
    ebp            0xbffff294 0xbffff294    
    esi            0x0 0    
    edi            0x0 0    
    eip            0x8048082 0x8048082 <plus+10>    
    eflags         0x206 [ PF IF ]    
    cs             0x73 115    
    ss             0x7b 123    
    ds             0x7b 123    
    es             0x7b 123    
    fs             0x0 0    
    gs             0x0 0    
    

    5+7 vaut 12 comme chacun le sait.
    Je ne sai pas par contre, comment redonner la main au système dans main()
    Johan
    Gates gave ^H sold you the windows.
    GNU gave us the whole house.(Alexandrin)
    0