Partage
  • Partager sur Facebook
  • Partager sur Twitter

nasm : creer une dll et l utiliser en c.

    20 février 2021 à 21:43:28

    Bonjour

    j essaie de m initier a l assembleur.

    j utilise nasm et codeblock pour le c.

    je me base sur un tuto qui produit uen fonction factorielle en assembleur et dont voici le code:

    default rel
    bits 64
    
    segment .text
    
    global factorial
    export factorial
    factorial:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 32
    
        test    ecx, ecx    ; n
        jz     .zero
    
        mov    ebx, 1       ; counter c
        mov    eax, 1       ; result
    
        inc    ecx
    
    .for_loop:
        cmp    ebx, ecx
        je     .end_loop
    
        mul    ebx          ; multiply ebx * eax and store in eax
    
        inc    ebx          ; ++c
        jmp    .for_loop
    
    .zero:
        mov    eax, 1
    
    .end_loop:
        leave
        ret

    pour assembler j utilise la commande :

    nasm -f win64 -o factorial.obj factorial.asm

    et pour linker en dll j utilise golink avec la commande :

    golink factorial.obj /entry factorial /dll C:\windows\system32\kernel32.dll c:\windows\system32\msvcrt.dll /export factorial

    au sortir de ces deux opérations je n ai aucun warning et j obtiens un fichier factorial.dll

    ensuite je fais un code c que j ai également déterré d un forum:

    #include <windows.h>
    
    typedef int  __stdcall factorial_(WORD);
    //extern  int factorial(int n);
    int _factorial(WORD n)
    {
      factorial_ *pfactorial = (factorial_ *)GetProcAddress(GetModuleHandle("factorial.dll"), "factorial");
      return pfactorial ? pfactorial(n) : 0;
    }
    int main()
    {
       int n;
       n=_factorial(9);
       printf("%d" , n);
       return 0;
    }

    je mets la dll dans le dossier projet/bin/debug (et en fait dans a peu pret tous les dossier du projet  y compris le dossier racine tant j étais dépité) et dans l onglet projet/build options/linker settings coté librairie j ajoute la dll.

    ca compile.

    mais ca retourne 0 c est a dire qu il ne trouve pas la fonction et que le pointeur de la fonction est nul.

    qu est ce que j ai mal fait? j ai l impression que je m y prends mal pour la inserer la dll mais j ai pu fauter a tant d endroit qu apres une aprem  d essais infructuex je viens vous demander de l aide.

    pour precision le tuto se faisait sous visual studio et necessitait l emploi d un prompt interne a vc.

    Aussi , pour tester si la fonction factorial marchait il compilait un exe en ajoutant un main ou il appel sa fonction avec une valeur qu il glisse dans rcx.

    Ca marchait , avec l exe.

    par avance merci.
     ps le stdcall semble vouée au 32 bit du coup je l ai enlevé sans que rien ne soit changé.



    -
    Edité par GouyFred 21 février 2021 à 10:22:43

    • Partager sur Facebook
    • Partager sur Twitter

    nasm : creer une dll et l utiliser en c.

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown