Partage
  • Partager sur Facebook
  • Partager sur Twitter

L'instruction LES en assembleur

Sujet résolu
    14 novembre 2022 à 14:10:48

    Salutation à vous.

    Pas compris une ligne de code sur le langage assembleur :
    xor ax, ax
    mov es, ax
    les bx, [es:0x33*4]
    

    Je ne comprends pas ce que fait la dernière ligne de code, dans le tutoriel il n'a mis aucune explication (comme souvent)
    La documentation semble donner des explications contradictoires.

    Merci d'avance pour vos réponses
    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2022 à 14:24:22

      umfred a écrit:

      quel tuto ? quel doc ?


      Le tuto https://esauvage.developpez.com/tutoriels/asm/assembleur-intel-avec-nasm/?page=page_5

      La documentation de LES https://www.gladir.com/LEXIQUE/ASM/les.htm

      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2022 à 15:47:57

        a priori ce que ça fait: ça met le contenu de l'adresse 0x33*4 par rapport à 0 (ES contient 0 car xor ax,ax ==0) dans bl, 0x33*4+1 dans bh, et 0x33*4+2 et 0x33*4+3 dans es

        mais si on prend la partie entière du bout de code

            xor ax, ax
            mov es, ax
            les bx, [es:0x33*4]
            mov cx, es
            or cx, bx
            jcxz pas_de_souris      ; aucune interruption présente!

        le commentaire et le label du jump de la dernière ligne indique l'utilité des lignes : vérifier qu'il n'y a pas d'interruptions liées à la souris

        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2022 à 16:20:41

          umfred a écrit:

          a priori ce que ça fait: ça met le contenu de l'adresse 0x33*4 par rapport à 0 (ES contient 0 car xor ax,ax ==0) dans bl, 0x33*4+1 dans bh, et 0x33*4+2 et 0x33*4+3 dans es

          mais si on prend la partie entière du bout de code

              xor ax, ax
              mov es, ax
              les bx, [es:0x33*4]
              mov cx, es
              or cx, bx
              jcxz pas_de_souris      ; aucune interruption présente!

          le commentaire et le label du jump de la dernière ligne indique l'utilité des lignes : vérifier qu'il n'y a pas d'interruptions liées à la souris


          J'en suis venu à la même conclusion pour bh, bl, es, j'ai donc cherché à vérifier avec des instructions, ça marche sur certains emplacement mémoire mais ça me donne des résultats étranges sur d'autres emplacement comme celui indiqué, ça ne marche pas parfois et je ne sais pas pourquoi et la frustration c'est que je n'arrive pas à voir le contenu des registres, j'en ai pourtant besoin pour comprendre.

          Sasm empêche d'utiliser certains registre comme es, le gdb en ligne c'est purement de la merde, et j'ai essayé de télécharger gdb mais il semble assez complexe en ligne de commande.

          Comment toi tu fais pour savoir si ça fait bien ce qui est indiqué ? 

          ps : Le commentaire explique l'utilité des lignes en général mais n'indique pas comment ça fonctionne concrètement, il n'explique pas le concept de segment et d'emplacement mémoire, il n'explique pas comment fonctionne l'instruction les, c'est beaucoup trop faible de juste mettre une ligne en général lorsque la personne qui va lire son truc cherche à comprendre

          -
          Edité par BastienPortigo 15 novembre 2022 à 16:22:09

          • Partager sur Facebook
          • Partager sur Twitter
            15 novembre 2022 à 17:47:06

            l'explication de la fonction LES tu l'as trouvé toi-même, il y a un exemple expliqué de ce qu'elle fait sur la page https://www.gladir.com/LEXIQUE/ASM/les.htm 

            pour le reste, je ne suis pas du tout un expert.

            • Partager sur Facebook
            • Partager sur Twitter
              15 novembre 2022 à 18:31:21

              umfred a écrit:

              l'explication de la fonction LES tu l'as trouvé toi-même, il y a un exemple expliqué de ce qu'elle fait sur la page https://www.gladir.com/LEXIQUE/ASM/les.htm 

              pour le reste, je ne suis pas du tout un expert.


              La réalité des faits > l'explication

              J'ai testé pour voir si ça faisait bien ce que la documentation a dit et le teste n'est pas concluant malheureusement

              Le teste : 

              xor ax, ax ;On met ax à 0
              mov es, ax ;On met ax dans es
              les bx, [es:0x33*4]
              mov dl, [es:0x33*4] 

              Comme tu dis les met [es:0x33*] dans bl, là avec le mov je mets aussi [es:0x33*4] dans dl

              Maintenant je vérifie si c'est bien le cas avec ce code : 

              ;teste
              cmp dl, bl ;On vérifie si dl et bl sont égaux
              je teste ;Si c'est bien égal alors on va à l'adresse indiqué
              ret
              ;teste
              
              teste:
              ;teste
              mov si, imprimantes
              call affiche_chaine ;On affiche la chaîne imprimantes 
              ret
              ;teste
              
              imprimantes: db ' imprimante(s) connectée(s).', 13, 0


              Si les résultats sont égaux la chaîne imprimante doit s'afficher, ce n'est pas le cas, donc la documentation semble sortir du caca à moins que l'instruction mov ne met pas ce qu'il y a dans l'adresse mémoire dans dl

              • Partager sur Facebook
              • Partager sur Twitter
                15 novembre 2022 à 18:41:21

                tu as un ret qui est un retour de fonction, pas sûr de ce que ça va faire tel qu'écrit ici (mais ça semble OK)

                l'instruction LES modifie aussi le registre ES (source+1=>BL ,source+2=>BH, source+3 et source+4=>ES) donc ton instruction mov ne copie pas les mêmes données, ES étant différent, il faudrait refaire un xor es,es avant.

                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2022 à 19:00:55

                  umfred a écrit:

                  tu as un ret qui est un retour de fonction, pas sûr de ce que ça va faire tel qu'écrit ici (mais ça semble OK)

                  l'instruction LES modifie aussi le registre ES (source+1=>BL ,source+2=>BH, source+3 et source+4=>ES) donc ton instruction mov ne copie pas les mêmes données, ES étant différent, il faudrait refaire un xor es,es avant.


                  Oui j'avais oublié de remettre es à 0 bordel

                  Sinon ret sert à sortir d'une fonction ou à sortir du programme, ici teste n'est pas une fonction, car une fonction doit s'appeler par l'instruction "call" donc mon teste fonctionne lorsque je remets es à 0

                  J'avais marqué la même chose que toi pour la documentation avec les : 

                  les bx, [es:0x33*4]
                      ;[es:0x33*4] est un emplacement mémoire
                      ;L'instruction les permet de mettre le contenu de l'emplacement mémoire ainsi que le contenu de ce même emplacement mémoire +1 dans bx
                      ;Le contenu de l'emplacement mémoire sera mis dans bl, le contenu de l'emplacement mémoire +1 sera mis dans bh
                      ;Ensuite l'instruction met le contenu de l'emplacement mémoire +2 et +3 dans es
                      mov cx, es ;On met es dans cx
                  • Partager sur Facebook
                  • Partager sur Twitter

                  L'instruction LES en assembleur

                  × 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