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

jisisv Messages postés 3678 Statut Modérateur 935
 
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
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
jisisv Messages postés 3678 Statut Modérateur 935
 
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