On peut pas mettre de listes dans un tableau simple, sinon je l'aurais fait.
Pas de souci. Par contre, tu peux jouer avec la ponctuation, en mettant des points-virgules au lieu de virgules.
C'est expliqué dans les chapitres qui suivront. Pour le moment, considère ton CPU comme une boite noire dont on décrit le fonctionnement. Cette séparation architecture ASM et µarch a un but pédagogique.
Peut-être le préciser en introduction ?
Cette troncature correspond mathématiquement (en décimal, si tu préfère) : soit à une troncature, soit à un arrondi. Ça dépend du nombre.
En fait, je ne vois pas quand on a un arrondi, puisqu'il me semble qu'on tronque tout le temps.
Quand tu veux passer en revue un Byte bit par bit en utilisant un nombre minimal d'instructions, par exemple ? Peut-être que tu trouveras des exemples en lisant mon cours sur les bits à bits et le branch free code.
Il me semble intéressant d'ajouter une note à ce sujet.
Merci pour tes retours. Je poursuis les miens :
Opcode et mode d'adressage
Dans ces conditions, difficile de faire la différence entre donnée et instruction.
La question qui me vient à l'esprit est : pourquoi ne pas les stocker à deux endroits différents ?
La suite de bits de l'instruction contient une sous-suite qui permet d'identifier l'instruction en question
Ca fait bizarre, puisque ça n'a pas de rapport avec le problème que tu mentionnes juste au-dessus : "Dans ces conditions, difficile de faire la différence entre donnée et instruction.". On s'attend à d'abord apprendre comment distinguer une instruction d'une donnée, puis les instructions entre elles.
Il arrive que certaines instructions soient composées d'un Opcode, sans rien d'autre : elles ont alors une représentation en binaire qui est unique. Mais certaines instructions ajoutent une partie variable pour préciser la localisation des données à manipuler.
Peut-être pourrais-tu donner des exemples d'instructions prenant ou non des paramètres ?
Reste à savoir comment interpréter cette partie variable : après tout, c'est une simple suite de bits qui peut représenter une adresse, un nombre, un nom de registre, etc.
On ne peut pas le déduire de l'opcode ? J'ai peut-être mal compris, mais pour moi, l'opcode est un nom de fonction, auquel on joint des paramètres potentiels.
Avec l'adressage immédiat, la partie variable est une constante
Je ne suis pas sûr de comprendre cela. Veux-tu dire que le paramètre est toujours le même (ce qui n'aurait pas grand intérêt) ou plutôt qu'on stocke sa valeur directement dans l'instruction ?
Le fait qu'on n'ait qu'un seul opérande m'intrigue, puisqu'une addition est une opération binaire.
Qu'est-ce que "EAX" ? Le nom du registre contenant 1002 ?
Sans ce mode d'adressage, on serait obligé d'utiliser une instruction utilisant le mode d'adressage direct, et de modifier l'adresse incorporée dans l'instruction avec du self-modifying code. Imaginez l'horreur.
Pourquoi est-ce une horreur ?
Je ne comprends pas trop le schéma. Pourquoi as-tu dans un registre une adresse (1002) et dans les autres des valeurs (17, 610, etc.) ?
De plus, je ne suis pas certain de ce sur quoi pointe la flèche "+1".
On doit donc calculer son adresse à partir de l'indice et d'autres informations.
Je ne comprends pas le "d'autres informations". Veux-tu dire par là "l'adresse de la case d'indice 0" ?
Pour éviter d'avoir à calculer les adresses à la main avec le mode d'adressage register indirect, on a inventé un mode d'adressage pour combler ce manque : le mode d'adressage Indexed Absolute.
Qu'apporte le mode d'adressage Indexed Absolute par rapport au Register Indirect Autoincrement ?
J'ai du mal à voir à quoi correspond le second opérande.
La majorité des tableaux sont des tableaux dont l'adresse n'est pas connue lors de la création du programme : ils sont déclarés sur la pile ou dans le tas, et leur adresse varie à chaque exécution du programme. On peut certes régler ce problème en utilisant du self-modifying code, mais ce serait vendre son âme au diable !
J'ai eu du mal à comprendre cela, parce que je n'ai pas pensé au fait qu'on pouvait créer une instruction sur le tableau avant sa création (donc avant qu'on connaisse son adresse), ce qui nous oblige à mettre à jour son adresse une fois qu'il est créé. Un cas de figure aiderait.
Par exemple, voici ce que donnerais une structure composée d'un entier, d'un flottant simple précision, et d'un caractère
Tu pourrais donner un exemple de structure d'un point de vue programmation. A l'origine, je croyais que tu parlais des dictionnaires.
Calculer l'adresse d'un élément de notre structure se fait donc en ajoutant une constante à l'adresse de départ de la structure
Je vois ce que tu entends, mais la formulation est un peu étrange puisqu'on pourrait croire qu'il n'y a qu'une constante. Alors qu'en fait, c'est une constante par élément.
Encodage du mode d'adressage
Peut-être que tu pourrais insérer cette partie avant la liste des différents modes, puisqu'elle répond aux questions posée au début de ce message.
Les opérandes d'une instruction n'ont pas la même taille. Ce qui fait que nos instructions auront des tailles différentes, si elles utilisent des opérandes différentes.
Peut-être être plus explicite sur ce qui fait varier la taille. Celle de l'opcode est, j'imagine, constante, mais la présence ou non du mode d'adressage (de taille constante ?) influe sur la taille de l'instruction, tout comme celle des opérandes.
Les schémas aident globalement à comprendre, mais des exemples concrets seraient je pense plus explicites : je suis dans tel mode d'adressage, j'envoie telle instruction, que se passe-t-il pas-à-pas ? Après, il faut savoir que j'aime beaucoup les cas de figure pour illustrer les propos, donc mon conseil est probablement biaisé.
Merci.