Partage
  • Partager sur Facebook
  • Partager sur Twitter

[asm] gestion des chaines de caractères

    25 mars 2007 à 21:19:42

    bonjour,
    j'essaie (mais sans succès) de manipuler des chaines de caractères.
    j'ai (presque) tout essayer.
    par exemple :
    compare:
            push ebp
            mov ebp,esp
            mov edx,[ebp+8]
            mov ecx,[ebp+4]
            lea edx,[edx]
            lea ecx,[ecx]
    .L1:
            cmp dword [ecx],0
            je .L2
            cmp dword [ecx],0
            je .L2
            mov eax,[ecx]
            cmp [edx],eax
            je .L2
            inc edx
            inc ecx
            jmp .L1
    .L2:
            mov eax,[ecx]
            cmp [edx],eax
            je .L3
            mov eax,0
            jmp .L4
    .L3:
            mov eax,1
    .L4:
            leave
            ret

    et même de "traduire" un C en GAS puis en nasm mais çà marchait pas plus.
    1/ en gros, y a-t-il une "relation" C <=> asm
    en ayant, par exemple "mov eax,[ebp+8]"
    eax = char*
    [eax] = char

    2/ quand faut il utiliser mov et quand utiliser lea ?

    merci
    • Partager sur Facebook
    • Partager sur Twitter
      25 mars 2007 à 21:43:25

      Relation C <=> ASM, bah oui, dans le sens ou tout programme est une suite d'instruction binaire, et que ces instructions peuvent être remplacées par des mnémoniques quelconques, donc par de l'asm. Mais étant donné les inclusions de librairie, les optimisations, particularités des proco, et du coté "automatique" de la compilation, le code ASM généré est surchargé et peu-enclin à être lu ^^

      Ensuite, étant donné la limitaiton du nombre et de la taille des registres, le compilo les utilisent plutot occasionellement de façon à stocker une variable, sauf si c'est précisé (register int eax = 5; par exemple). Un programme compilé à partir d'un langage comme le C utilise exclusivement la mémoire, et utilise les registres pour stocker temporairement les variables afin d'effecter certaines instructions.

      ----------

      LEA:
      Transfers offset address of "src" to the destination register.

      MOV:
      Copies byte or word from the source operand to the destination operand.

      La différence est donc: LEA place l'adresse effective de la source dans la destination, tendis que MOV copie la source dans l'opérande ^^

      ----------

      Pour comparer deux chaine, moi j'ai fait ca, y'a longtemps donc y'a ptet des trucs un peu sale, mais ca fonctionne bien, (chaines terminées par \0)

          _compare:
              pop bx
             
              mov edi,[esp+2]

              cld

              mov ecx, -1
              mov al, 0
              repne scasb
              neg ecx
              lea ecx, [ecx-1]

              pop edi      ;//Adresse s2
              pop esi      ;//Adresse s1

              repe cmpsb
             
              je r_same

              r_diff:
                push dword 1
                jmp _compare_e
              r_same:
                push dword 0
              _compare_e:

              push bx
          ret
      • Partager sur Facebook
      • Partager sur Twitter

      [asm] gestion des chaines de caractères

      × 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