ASSEMBLEUR BIZAR !!!

csmart Messages postés 66 Statut Membre -  
csmart Messages postés 66 Statut Membre -
Salut a la Communauté!!!

Voici le source d'un code en C tout simple...! Il ne fait kapeler une fonction parametre dan le but d'illustrer le mecanisme de passage des argument. C tout!!

#include <stdio.h>

void ma_fonction(int, int, int);

void main(void)
{
	int x;

	ma_fonction(1,2,3);
	
	x=1;
	printf("\nx = %d\n", x);
}

void ma_fonction(int a, int b, int c)
{
	char buffer[5];
	char buffer2[10];
	int n;
}


Jtravaille sous windows 98 avec l'EDI de Borland Turbo C/C++ version 3.0 (en passant, il n'y en pas de plus evolué?). Bref...
Quand je desassemble le code executable de ce petit programme jariv pa a retrouver les instructions asm qui correspondent a celles ecrite en C dans le code source. Plus precisement jdevrais en principe (au moins) voir les instructons suivantes avant l'appel de la fonction, des instructions du genre:

        ...
        push 3                          ; empilement des...
        push 2                          ; parametres passes...
        push 1                          ; a la fonction
        call <adresse de ma_fonction>   ; appel de ma_fonction
        ...
        push bp                 ; a l'entree de ladite fonction...
        mov bp,sp
        ...


Mais que NENNI!!! Jne retrouve aucune de ces instructions tout au long du desassemblage du code...! J'utilise pour le deboguage <DEBUG> avec comme parametre le chemin d'acces de l'executable du code. Puis jtape <U> - la commande de desassemblage. Puis une liste d'instructions apparait. Puis jtape <U>, et <U> enkor, et enkor, et enkor... Et dans le long listing ki en resulte, RIEN! Pas de trace du code desassemble correspondant au fichier source C compile.

Poutant kan jtape la commande <G> - ki execute directement le code du fichier juska la fin, le code s'execute normalement et marque meme <PROGRAMME TERMINE NORMALEMENT> a la fin de l'execution...!

Alor, ma kestion est toute simple:

1/ koman visualiser le code desassemble de mon executable - passage des arguments a la fonction, entree/sortie de la fonction, etc. ? Est-ce un parametrage de DEBUG kil faille effectuer et que je nai pas fait ? Ou alor plu simplement DEBUG ne peut pas le faire ? Dans ce cas ou puis-je me procurer un debogueur en ligne de commande moins ARCHAIQUE que ce DEBUG ?

2/ Et tenez vous bien ! KELKE SOIT le program exe ke je lance avec DEBUG, les premieres lignes (et meme les suivantes !) affichent les memes instructions du genre:

        (...)
        MOV DX, <valeur_ki_varie_selon_le_prog>
        MOV CS:[valeur_toujours_fixe], DX       ; 7valeur ne change pas...

        MOV AH,30                               ; recupere la version du DOS
        INT 21
        (...)

        ; suivi de plusieurs instructions repetees du genre...
        (...)
        MOV AX,35xx
        INT 21
        (...)



Keske tous cela signifie, et pkoi mon code a moi n'apparait pas ?

1000 FOIS MERCI DAVANS A TOUTE LA COMMUNAUTE !!!!!!!
A voir également:

3 réponses

jisisv Messages postés 3678 Statut Modérateur 935
 
Si ton package borland est complet (j'ai un Borland c++3.1)
tu compiles ton source avec options->debugger->standalone
Tu utilises Turbodebugger (td.exe)
Tu mets un point d'arrêt sur ton appel de fonction,
puis
view->CPU. Moi j'obtiens ceci, c'es pa s correct?
#TEST#9:  ma_fonction(1,2,3);
  cs:02C8►B80300         mov    ax,0003
  cs:02CB 50             push   ax
  cs:02CC B80200         mov    ax,0002
  cs:02CF 50             push   ax
  cs:02D0 B80100         mov    ax,0001
  cs:02D3 50             push   ax
  cs:02D4 E81800         call   _ma_fonction
  cs:02D7 83C406         add    sp,0006
#TEST#11:  x=1;
  cs:02DA C746FE0100     mov    word ptr [bp-
#TEST#12:  printf("\nx = %d\n", x);
  cs:02DF FF76FE         push   word ptr [bp-


En forçant le processeur 386
j'obtiens
#TEST#9:  ma_fonction(1,2,3);
  cs:02C6►6A03           push   0003
  cs:02C8 6A02           push   0002
  cs:02CA 6A01           push   0001
  cs:02CC E81600         call   _ma_fonction
  cs:02CF 83C406         add    sp,0006
#TEST#11:  x=1;

Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
0
jisisv Messages postés 3678 Statut Modérateur 935
 
De toute manière , ne t'attends pas à trover immédiatement la fidèle traduction en assemebleur de ton code C.
Même sous DOS, les compilateurs génèrent du code préambule à TON code.
Avec le compilo en ligne de commande, bcc.exe tu peux obtenir un fichier assemebleur. (j'utilise 4NT comme interpréteur de commandes mais sa configuration est bousillée avec ces outils Borland)
bcc -S test.c
(il faut indiquer aussi les chemlins include)

Sous Linux
gcc -S test.c

...
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
movl $3, 8(%esp)
movl $2, 4(%esp)
movl $1, (%esp)
call ma_fonction
movl $1, -4(%ebp)
....
gcc -S -mcpu=i386 test.c #processeur i386
...
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
subl $4, %esp
pushl $3
pushl $2
pushl $1
call ma_fonction
...
On peut se demander quel est le code optimal (cycle processeur), mais je ne suis vraiment pas versé en cette matière.
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
0
csmart Messages postés 66 Statut Membre
 
Mais Saperlipopette!! Avec l'EDI de Borland Turbo C/C++ 3.0 g recup sur le net une autre version de Turbo Deugger et la... Magie de l'informatique...(?) me donne EXAC-TE-MENT le code asm que tu ma envoyé...!!!

Avec pour chaque ligne en C son (ou ses) ékivalan en ASM !!! Je peux enfin deboguer mes program trankilo! Depuis le temps ke je cherch a le faire et ke sa ne march pas!!!

La persévérance fini tjours par payer!!!

Chui touta fait daco:
Bill nous a donné juste les fenètres.
GNU nous a donné toute la Maisonnée! Nom de Dieu! C pa mieux, sa?

1000FOIS Merci...!!! On garde le contact, hein!!
0