Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mémoire assembleur x86...Je ne comprend rien

Sujet résolu
    10 juin 2020 à 2:55:52

    Bonjour à tous !

    Depuis peu j'essais de m'initier à l'assembleur x86...En revanche je ne comprend quasiment rien, ayant fait pas mal de C++ il y a une chose qui me chiffonne : AX, BX,...AH,BL... Enfin toutes ces choses : est-ce qu'on peut les "associer" à des types ? Par exemple AH serait un 'short' de C++ et AX un 'int'. Le problème c'est que je ne sais pas si c'est un type (comme énoncé précédemment) ou bien un "nom de variable". Le problème c'est que ça a l'air de limiter vachement la chose :/. Enfin bref c'est pas claire...Et aussi pourquoi dans ce code-ci :

    org  0x0100
    
    mov  dx, texte
    mov  ah, 0x09
    int  0x21
    ret
    
    texte: db 'Hello, World !!', 10, 13, '$'

    présenté dans beaucoup d'exemple, d'ou sors le 0x21 ? et le 0x09 ? Je veux bien que ces valeurs doivent être au dessus de 0x0100 mais pourquoi pour afficher mon texte je dois utiliser 0x21...Je suis largué là, merci !

    Le cour où j'ai piqué le code (Je sais qu'il n'ai pas terminé !)

    -
    Edité par DeveCout 10 juin 2020 à 2:57:03

    • Partager sur Facebook
    • Partager sur Twitter
      10 juin 2020 à 6:58:28

      Prends un bouquin sérieux sur l'architecture des ordinateurs. Ce que tu connais de c++ n'a rien à voir.

      AX, BX, etc sont des _registres_ accessibles au programmeur, qui dispose d'instructions pour y mettre des données, et effectuer des opérations diverses (ça dépend des registres, sur le x86).

      Le 0x21 désigne un numéro d'interruption, un moyen de demander au système d'exploitation de faire quelque chose. Quand on fait ça, on a mis un code fonction dans AH. Ici, 9, pour "écrire la chaine pointee par DX".

      AH et AL sont les moitiés hautes et basses de AX.

      PS : l'architecture x86 est un peu peu compliquée (manque de régularité, pour cause de compatibilité voulue avec les 8080) et ça ne s'est pas arrangé après.

      -
      Edité par michelbillaud 10 juin 2020 à 9:47:13

      • Partager sur Facebook
      • Partager sur Twitter
        10 juin 2020 à 16:14:07

        Mais du coup comment faire pour sauvegarder plus de  64bit? Vue qu'on a 4 register de 16bits chacun. Donc la mémoire RAM est limité ou bien est-ce qu'on peut "l'améliorer" ? Par exemple Ici je comprend pas quelle ligne demande à l'ordinateur d'afficher 'texte'. J'aurais bien dit la commande "int" vue que les autres ne servent qu'a attribuer des valeurs ou bien n'ont aucun paramètre. Donc je ne comprend pas en quoi '0x21' à un rapport avec 'texte'. Je n'ai pas bien compris ce qu'était le concept de numéro d'interruption, je suppose qu'il s'agit d'une sorte de pause système le temps qu'une autre instruction sois réalisé. C'est bien ça ?
        • Partager sur Facebook
        • Partager sur Twitter
          10 juin 2020 à 16:22:50

          C'est une sorte d' "appel de fonction".

          Sauf que quand un appel de fonction "normal", on exécute une instruction CALL qui contient l'adresse du code de la fonction.

          Avec une interruption, c'est différent. Le programme en cours, qui était en mode "normal" est interrompu - d'où le nom - et à la place on part exécuter le code qui est à l'emplacement 21 d'un "vecteur d'interruption", tout en passant en "mode maître".Là c'est le système qui a pris la main, et qui s'occupe de faire l'opération indiquée dans le registre AH/

          Mais c'est long à expliquer, il faut VRAIMENT que tu lises une doc. Parce que là tu t'embarques dans des idées révélatrices d'une grande imagination, mais ça sera plus simple et plus sûr de rejoindre la réalité.

          ---

          64 bits ? Ben, avec des registres 16 bits, ça peut se faire en 4 coups.

          -
          Edité par michelbillaud 10 juin 2020 à 16:24:46

          • Partager sur Facebook
          • Partager sur Twitter
            10 juin 2020 à 17:48:18

            un autre cours par exemple => https://www.supinfo.com/cours/1CPA/chapitres/09-assembleur-x86#idm44858296754096 pour la partie sur les interruptions.
            et oui en assembleur, on est "limité": la taille de base d'un registre (ici en tout cas), c'est 8 bits, mais en les combinant, on a des registres de 16, 32, 64.

            Pour se rapprocher un peu du C/C++, on peut voir "int" comme un appel à une fonction, et souvent, une fonction attend des paramètres. En assembleur, on passe les paramètres en initialisant certains registres (ceux utilisés par la fonction).
            Pour passer des paramètres, on peut aussi passer la pile (une zone mémoire qui permet de stocker (PUSH) ou lire (POP) une donnée),
            • Partager sur Facebook
            • Partager sur Twitter
              11 juin 2020 à 10:43:33

              En gros si j'ai bien compris les appels mémoire permettent d'accéder à des fonctions (qui seront stocké à l'endroit indiqué sur les registres suivant je suppose : Une fonction d'un seul registre relèverais du surnaturel), ou bien une valeurs (Variables). Je vais essayer de bidouiller 2-3 trucs pour comprendre réellement mais j'avoue que je comprend pas cet exemple puisque pour moi c'est des valeurs mémoire qui sorte de nul part...En revanche le code fonctionne c'est là que ça coince, j'ai aucun problème à l'idée que les valeurs puisse contenir des fonctions et tout ce que vous avez dit, mais moi j'essais de comprendre comment 'texte' s'affiche. Perso je lis le code comme ça:

              -dx prend la valeurs de 'texte' (Grâce à la 'commande' mov)

              -ah prend la valeurs '0x09' qui pour moi sort de nul part si ce n'est la partie haute du dernier octet juste avant d'être alloué au programme (car celui-ci commence à partir de l'octet 0x0100)

              -On affiche la valeurs de 0x21...Qui encore une fois sort clairement de nul part :/

              Désolé d'être chiant mais je viens ici parce qu'en lisant les docs je comprend pas grand chose, le concept de mémoire RAM je pense l'avoir compris, celui des "Commandes" qui sont juste des raccourcis d'ordre aux yeux de l'assembleur. Mais voilà c'est juste ces addresses mémoire que je ne comprend pas, elles sont universelles/Accessibles  à touts les programmes ou relatives à celui-ci ?

              • Partager sur Facebook
              • Partager sur Twitter
                11 juin 2020 à 10:53:28

                - aux yeux de l'assembleur, il n'y pas de raccourcis.

                - on n'affiche pas les valeurs de 0x21.

                - les valeurs ne contient pas de fonctions. Les registres contiennent des données, celles qu'on y met.

                - la valeur 0x9 sort des conventions adoptées par le DOS/BIOS, qui font que le code 9 pour l'interruption 21 provoque un affichage.

                - c'est parce qu'on veut avoir une séparation entre programme utilisateur et système que l'appel se fait pas une interruption logicielle plutôt que par une instruction d'appel de sous programme.

                Ecoute, sérieusement. c'est pas possible de t'expliquer ça en 20 lignes. Et tu ne t'en sortiras pas avec tes notions de C++. Il faut que tu lises un bouquin sérieux.

                -
                Edité par michelbillaud 11 juin 2020 à 14:52:04

                • Partager sur Facebook
                • Partager sur Twitter
                  11 juin 2020 à 11:01:24

                  0x09 c'est pour indiquer le type d'action que l'interruption va faire (on pourrait dire que c'est un paramètre de type énumération); 0x21 c'est l'adresse de l'interruption qui va appeler la fonction d'affichage selon le paramètre ah et utiliser le texte pointé par dx;
                  Il faut voir qu'il y a déjà du code qui est écrit et qui constitue les briques de base (on pourrait parler de librairies).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 juin 2020 à 11:24:42

                    michelbillaud a écrit:

                    Ecoute, sérieusement. c'est pas possible de t'expliquer ça en 20 lignes. Et tu ne t'en sortiras pas avec tes notions de C++. Il faut que tu lises un bouquin sérieux.

                    -
                    Edité par michelbillaud il y a 21 minutes

                    Euh...Je voulais juste comprendre ces quelques lignes de code, j'ai à aucun moment demander un cours particulier. Je suis venu parce que je voulais quelques info...Enfin bref. D'ailleurs par "Raccourcis" j'entendais que la valeurs serait remplacé dans le système par une valeurs hexadécimal...Une sorte de remplacement.

                    umfred a écrit:

                    0x09 c'est pour indiquer le type d'action que l'interruption va faire (on pourrait dire que c'est un paramètre de type énumération); 0x21 c'est l'adresse de l'interruption qui va appeler la fonction d'affichage selon le paramètre ah et utiliser le texte pointé par dx;
                    Il faut voir qu'il y a déjà du code qui est écrit et qui constitue les briques de base (on pourrait parler de librairies).

                    Ah ok ! Je crois que je comprend le sens du 0x21, donc on a 4 Variables courantes (qu'on peut utiliser à tout moment). Une sorte de "Selecteur" de variable... Enfin bon je vois que le post dérange donc je vais certainement le mettre sur "résolue"

                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 juin 2020 à 14:02:30

                      DeveCout a écrit:

                      Euh...Je voulais juste comprendre ces quelques lignes de code, j'ai à aucun moment demander un cours particulier. Je suis venu parce que je voulais quelques info...Enfin bref. D'ailleurs par "Raccourcis" j'entendais que la valeurs serait remplacé dans le système par une valeurs hexadécimal...Une sorte de remplacement.



                      Oui moi aussi je voudrais juste un peu comprendre une toute petite équation de physique quantique :-)

                      Bon le problème vient du cours que tu as choisi de suivre qui commence par


                      Dans de nombreux cours sur l'assembleur, il y a beaucoup 
                      de théorie dès le début et on ne commence à coder qu'après beaucoup 
                      trop de temps. Résultat : on en a marre et on abandonne. 
                      C'est pour cela que j'ai choisi que nous allions, dès ce chapitre, 
                      faire notre premier programme, mais en passant tout de même par les 
                      notions les plus essentielles.


                      Ben voila. Tu sais d'où vient le problème. Le type, il veut pas s'emmerder à expliquer. ben c'est dommage, parce que sans expliquer ce qu'on appelle "le modèle du programmeur", ce qu'on peut faire au maximum c'est remplacer "hello world" par "bonjour monde".

                      -
                      Edité par michelbillaud 11 juin 2020 à 14:53:33

                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 juin 2020 à 15:15:57

                        Bon bah je vais chercher un autre cours alors, merci quand même !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 juin 2020 à 8:54:57

                          Pour te répondre :

                          "Mais du coup comment faire pour sauvegarder plus de  64bit? Vue qu'on a 4 register de 16bits chacun."
                          Ben vu que tu fais du code X86-16 bits qui est fait pour s’exécuter sur MS-DOS (et donc que le format est du .com) donc tu es limité" à du 16 bits.
                          Il faut noter que ce code ne peut pas s’exécuter sur Windowsd , il faut obligatoirement un émulateur (comem Dosbox) pour que ça marche :p
                          Mais ce que dis @umfred  est faux ,on ne combien pas des registre pour avoir du 64 bits, il existe le registre RAX qui est bien un registre 64 bits ;)
                          Il existe bien sur une façon "d'émuler" des valeurs plus grand , c'était le cas des processeurs 8 bits qui faisait souvent des calculs sur 16 bits

                          "Donc je ne comprend pas en quoi '0x21' à un rapport avec 'texte'."
                          Tu as deux façon pour afficher un truc ,soit en mode texte, et là l'OS (ici MS-DOS) a quelque fonction prefaite pour afficher sur le framebuffer.
                          soit dessiner directement sur le framebuffer pour afficher ce que tu veux ;)

                          Mais bon MS-DOS + x86-16 bits , c'est un peu obsolète.
                          si tu veux faire ça sur un OS moderne , il faudra passer pas des fonction (soit system , soit par la lib C par exemple).
                          Mais bon , c'est un peu ça le peu d'interet de faire de l'asm actuellement , si tu le fait sur un OS , tu passe ton temps à appeler des fonction écrite en C , en asm :p

                          -
                          Edité par HelbaSama 12 juin 2020 à 12:19:14

                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 juin 2020 à 15:20:22

                            Le cours est là parce que le type avait un cours de programmation en assembleur sous dos 2.11 à recycler. Faut pas chercher plus loin :-) 

                            Mais l'intérêt pour qui n'a pas la pénible obligation professionnelle de faire des trucs non portables en assembleur 8086... ? Le 8086 et successeurs, c'est quand même salement compliqué, pour des raisons historiques. Si on veut juste avoir une initiation à la prog assembleur, vaut mieux investir 5€ dans un arduino, la programmation est plus simple et plus fun (on peut faire clignoter des trucs).

                            Sinon, le registre étendu, ça serait plutot EAX.

                            -
                            Edité par michelbillaud 12 juin 2020 à 15:24:35

                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 juin 2020 à 16:38:38

                              Mais je suis totalement d'accord avec toi ;)
                              Je conseille toujours plus un arduino, l'asm est simple et on apprend bien plus de chose que de faire joujou avec les call convention et l'asm assez horrible du x86

                              Oui le registre étendu c'est EAX (pour 32 bits) et la version 64 bits c'est RAX , c'est moche d'avoir garder les noms des registres du à cause de l'historique du proc x)
                              Ils ont quand même rajouté 8 registres (de R8 à R15) depuis le temps
                              N'importe quel autre proc se casse moins la tête et nomme leur registre R0 à R15 (ou R31) ^^

                              -
                              Edité par HelbaSama 12 juin 2020 à 16:41:05

                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 juin 2020 à 17:17:43

                                Bonjour.

                                Il y a aussi la série des Raspberry pi dont le processeur est un processeur ARM donc une architecture RISC avec un jeu d'instructions réduit.

                                c'est plus facile pour apprendre l'assembleur.

                                Pour moi, l'interruption 21H est une vieille instruction qui ne doit plus être utilisée !!  Sous Linux, on utilise l'interruption 80H et sous windows, de puis W8 les interruptions de ce type ne sont plus autorisées.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 juin 2020 à 20:07:39

                                  Le souci du Raspi comparé à un arduino , c'est que le matériel est bien plus compliqué , sur un arduino tu n'aura clairement pas ce soucis.
                                  L'autre point ,les RasPI de 1 à 3 c'est un processeur superscalaire in order donc la notion de d'instruction/cycle est bien plus flou , mais aussi l’optimisation de la pipeline des instruction est à la charge du programmeur de même que les instructions double bref bien sur qu'un débutant pourra pas optimiser de fou , mais c'est pas forcément des notions simples.

                                  La question que l'interruption 21h ne doit plus être utilisé est un non sens , c'est meme bien avant W8 que int21 ne marche plus hein , sur l'int 21h est une interruption MS-DOS donc a partir de là , elle marche que sur MS-DOS et ne marche plus sur Windows depuis belle lurette (je dirais depuis facile Windows XP voir W95).
                                  Son code c'est clairement un code pour du .com , donc destiné à du MS-DOS...

                                  Sur Linux , l'interruption 80h ne doit plus être utilisé , on utilise le syscall maintenant :)
                                  (parce que bon le 32 bits ça commence à dater aussi ;) ).

                                  -
                                  Edité par HelbaSama 14 juin 2020 à 14:51:55

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Mémoire assembleur x86...Je ne comprend rien

                                  × 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