begin process at 2010 02 09 23:09:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Divers

 > 

Débutant(e)

 > 

[FASM]Traduction program C to ASM


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

[FASM]Traduction program C to ASM

mardi 17 février 2009 à 21:24:14 | [FASM]Traduction program C to ASM

The Red Man

je suis completement new in ASM :
J'aimerai savoir je pourrai traduire ce bout de C en ASM, j'ai essayé déjà ça compile pas avec :
include "win32ax.inc"

;=================================================
; TP 0 : Translation C program To ASM using FASM
;=================================================
;int i = 0;
;int n = 10;
;int s = 0;
;while (i < n){
;        if (i%2){
;                s += i;
;        }
;        i++;
;}


include "win32ax.inc"

entry start


section ".text" code readable executable
start:
        mov eax, 0              ; s = 0
        push eax
        mov eax, 10             ; n = 10
        push eax
        mov eax, 0              ; i = 0


        pop ebx                 ; on recupere n=10
        cmp ebx, eax            ; cmp i & n

        push ebx                ; on sauvegarde les valeurs n=10
        push eax                ; i=0

        jnl WHILE_LOOP          ; while (i<n) <=> if i != n

        invoke ExitProcess, 0

;=======================
; While...
;=======================
WHILE_LOOP:
        pop eax                 ; on recupere i=0
        mov ebx, eax            ; on copie la valeur de eax dans ebx => eax = ebx = 0
        push ebx                ; on place la ebx = 0 dans la pile

        mov ebx, 2
        idiv eax                ; division entiere (euclidienne) par 2, le quotient : AL et le reste : AH (i/2)
        cmp eah, 0              ; on cmp le reste de la division par 0 <=>  cmp i%2 & 0

        je IF_OK                ; if i%2 == 0


;=======================
; If...
;=======================
IF_OK:
        pop eax                 ; on reucpere la valeur de i=0
        pop ebx                 ; on recupere n=10
        pop ecx                 ; on recupere s=0

        add ecx, eax            ; on ajoute la valeur d'eax (i) dans ecx (s) <=> s+=i
        push ecx                ; on sauvegarde ecx (s)
        inc eax                 ; on incrémente eax <=> i++

        cmp eax, ebx            ; compare eax et ebx <=> i & n
        push ebx                ; on sauvegarde la valeur n=10
        push eax                ; on sauvegarde la valeur de i=i+1
        je WHILE_LOOP           ; if i < n => go to WHILE_LOOP


section '.idata' data readable import
        library kernel32, 'kernel32.dll'
        import kernel32, ExitProcess, 'ExitProcess'


ça serai cool merci !
samedi 21 février 2009 à 22:11:09 | Re : [FASM]Traduction program C to ASM

BruNews

Administrateur CodeS-SourceS

On ne "traduit" pas littéralemebnt du C en ASM, on doit le repenser en ASM.
C'est ce que fait un compilo C de manière automatisée mais oh combien très élaborée.

Ton code à transcrire:
int i = 0;
int n = 10;
int s = 0;
while(i < n) {
  if(i % 2) s += i;
  i++;
}

On va donc commencer le travail par 2 petites réflexions.
1) if(i % 2) nous devons donc vérifier si nbr est pair ou impair.
Hors de question de faire un DIV de 40 cycles pour un truc si bidon.
Simple test ur le dernier bit nous dira la même chose en 1 cycle.
Tout ça pour dire que souvent, même si mal codé comme ici, le compilo C rattrapera en remplaçant par le bon code efficace (eh oui, il le fait).

2) Malheureusement c'est encore une errreur de prog au niveau du C (peut-être voulue si c'est un exercice de class), que le compilo aura certainement aussi rattrapée.
Le 1er tour de boucle ne servirait à rien:
s += i; ferait += 0 donc inutile.
On démarrera donc i à 1 au lieu de 0.

mov   eax, 1   ; i = 1
xor   edx, edx ; s = 0
whileIinf10:
test  eax, 1
je    short nextI
add   edx, eax
nextI:
inc   eax
cmp   eax, 10
jne   short whileIinf10

Voila pour une 1ere phase ASM correcte, mais loin d'être performante.
Pour l'obtenir, il faut tendre vers 0 tant que faire se peut et ici c'est le cas, on gagnera ainsi 1 CMP par tour de boucle puisque le CPU place EFLAGS sur toute opération arythmétique.

Voici prog en C (fait sur VC++) qui testera tout cela, y compris la version 2 de ASM.
On obtient bien 25 à tout coup.
EXE résultant fait 2.5 Ko, pas de quoi pourrir un disque dur, donc ne pas se priver de tester.

#include <windows.h>

int Original()
{
  int i = 0;
  int n = 10;
  int s = 0;
  while(i < n) {
    if(i % 2) s += i;
    i++;
  }
  return s;
}

int bnOriginal()
{
  int i = 1;
  int s = 0;
  do {
    if(i & 1) s += i;
  } while(++i < 10);
  return s;
}

__declspec(naked) int __stdcall bnASM()
{
  __asm {
    mov   eax, 1   ; i = 1
    xor   edx, edx ; s = 0
  whileIinf10:
    test  eax, 1
    je    short nextI
    add   edx, eax
   nextI:
    inc   eax
    cmp   eax, 10
    jne   short whileIinf10
    mov   eax, edx
    ret   0
  }
}

__declspec(naked) int __stdcall bnASM2()
{
  __asm {
    mov   eax, 9   ; i = 9
    xor   edx, edx ; s = 0
  whileIinf10:
    test  eax, 1
    je    short nextI
    add   edx, eax
   nextI:
    dec   eax
    jne   short whileIinf10
    mov   eax, edx
    ret   0
  }
}

void Essayer(VOID)
{
  char buf[12];
  int R;
 
  R = Original();
  ultoa(R, buf, 10);
  MessageBox(0, buf, "C", 0);
 
  R = bnOriginal();
  ultoa(R, buf, 10);
  MessageBox(0, buf, "C revu", 0);
 
  R = bnASM();
  ultoa(R, buf, 10);
  MessageBox(0, buf, "ASM", 0);
 
  R = bnASM2();
  ultoa(R, buf, 10);
  MessageBox(0, buf, "ASM optim", 0);
}

#pragma comment(linker, "/entry:myWinMain")
__declspec(naked) void __stdcall myWinMain()
{
  __asm {
    call    Essayer
    push    0
    call    dword ptr ExitProcess
  }
}


ciao...
BruNews, MVP VC++

dimanche 22 février 2009 à 02:18:42 | Re : [FASM]Traduction program C to ASM

The Red Man

Ah merci beaucoup ! C'est beaucoup plus clair maintenant. Maintenant faut tester tout ça.
dimanche 22 février 2009 à 10:57:22 | Re : [FASM]Traduction program C to ASM

BruNews

Administrateur CodeS-SourceS
OUPS,
rectif après nuit de sommeil.

Il faut lire:
"Simple test sur le 1er bit ..."
et non "Simple test sur le dernier bit ..."

ciao...
BruNews, MVP VC++


Cette discussion est classée dans : while, push, eax, ebx, if


Répondre à ce message

Sujets en rapport avec ce message

Différences ??? [ par Arecibo ] Voila je debute en assembleur et j'aimerais savoir quelles sont les différences entre :-> mov eax, ebx et mov eax, [ebx]-> mov esi, eax et mov [esi], Ancien code - CreateWindowEx ne fonctionne pas [ par TehWan ] Je ne comprends vraiment pas pourquoi CreateWindowEx ne fonctionne pas. Je code en ancien code avec MASM32. J'ai même essayé la nouvelle syntaxe (invo BeginPaint code débutant [ par TRAX44 ] Bonjour, le problème est tout simple je comprends absolument pas ce qui marche pas. Le "programme" est censé créer une fenêtre est afficher du texte e EAX=-val2+7-val3+val1 [ par rhumsek ] voici un programme qui doit donné un résultat en fonction de la formule suivante,mais je ne suis pas sur que le résultat obtenu après compilation du p LecteurEstDvd asm inline [ par AlexMAN ] Bonjour, Voila j'ai un ptit pb au nivo, je pense, de l'appel de la fonction DeviceIoControl, le code : //Fonction Cint __stdcall LecteurEstDvd(char *p Quels sont les parametres (nombre, taille...) [ par Renfield ] Bonjour,on peut appeler RunDll32 pour executer des fonctions contenues dans des dll...j'aimerais m'affranchir de cette étape, mais j'ai pour cela beso Afficher valeur registre ? [ par Zootella ] Hello all, dans un programme, celui-çi test la valeur d'un registre : cmp  dword ptr [eax],4550h je voudrais faire des tests et afficher cette vale j'ai un prob avec mon buffer ; ya pas d'amuses gueules (masm32) [ par papiboff ] bj si je mets le buffer "somme " en dd avec charge eax et que j'ajoute deux 'dec ebx ' , ben , marche pas correctement ; (pêrqué ???? = en french) sv inverser une chaine [ par MrdJack ] salut, je suis sur un projet de calculatrice me permettant de faire des calculs avec des nombres tres grands. chaque nombre est stocké dans la memoire Messagebox (niveau débutant) [ par Ulala2 ] Bonjour,je suis en train de créer une dll que je vais invoquer en vb6.Tout marche très bien, sauf pour la fonction messagebox dont n'arrive pas à récu


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales