8086 - pourquoi ne peut-on pas déplacer une immédiate des données dans le registre de segment?
Dans 8086 assemblage de programmation, nous ne pouvons nous en charger des données dans un registre de segment par, d'abord la charger dans un registre et puis nous devons nous déplacer à partir de ce registre général pour le registre de segment.
Pourquoi ne pouvons-nous pas de le charger directement? Est-il une raison particulière pour ne pas être autorisé?
Quelle est la différence entre mov ax,5000H
et mov ax,[5000H]
? Ne [5000h]
dire contenu dans l'emplacement de mémoire 5000h?
Cette question semble être hors-sujet, car il est à propos de la philosophie de conception de 30 ans en processeur.
Comment est-ce hors sujet? Si ce gars-là est la programmation d'un 8086 pourquoi ne pas aussi être un endroit pour obtenir de l'aide? Il demande une question d'ordre pratique. Si j'ai demandé "pourquoi ne puis-je pas écrire à l'arbitraire d'un emplacement de la mémoire en C?" voteriez-vous pour fermer que, pour la même raison? Assez beaucoup n'importe quelle question peut se résumer ainsi: "la conception de décision". Cela ne veut pas dire que c'est pas la peine de se demander et de savoir la réponse. Yeesh, les gens d'ici ont le devenir ridiculement main lourde avec leurs boutons de fermeture.
L'OP est de se demander pourquoi un certain opération n'est pas possible - parce que les ingénieurs ont conçu de cette façon. Le jeu d'instruction est ce que c'est. De se demander s'il devrait être quelque chose d'autre, de ne pas le modifier, ni l'aide de ce programme.
Droit, et vous pouvez probablement "réponse" environ 90% des questions posées ici avec la même réponse. Bien sûr, vous ne voudriez pas être aider n'importe qui, et vous n'auriez pas à faire le site mieux. Tous les choix de conception a une raison derrière tout ça (je l'espère!) et ces raisons sont la peine de savoir. Je préfère laisser un peu douteux questions glisser à travers (non pas que je pense que celui-ci s'inscrit dans cette catégorie) que nix questions utiles qui peuvent aider les autres en bas de la route.
Dans un pincement, si vous souhaitez charger un registre de segment, sans toucher à l'un des registres, vous pouvez toujours faire du "push immédiate / pop registre de segment' de la séquence.
Comment est-ce hors sujet? Si ce gars-là est la programmation d'un 8086 pourquoi ne pas aussi être un endroit pour obtenir de l'aide? Il demande une question d'ordre pratique. Si j'ai demandé "pourquoi ne puis-je pas écrire à l'arbitraire d'un emplacement de la mémoire en C?" voteriez-vous pour fermer que, pour la même raison? Assez beaucoup n'importe quelle question peut se résumer ainsi: "la conception de décision". Cela ne veut pas dire que c'est pas la peine de se demander et de savoir la réponse. Yeesh, les gens d'ici ont le devenir ridiculement main lourde avec leurs boutons de fermeture.
L'OP est de se demander pourquoi un certain opération n'est pas possible - parce que les ingénieurs ont conçu de cette façon. Le jeu d'instruction est ce que c'est. De se demander s'il devrait être quelque chose d'autre, de ne pas le modifier, ni l'aide de ce programme.
Droit, et vous pouvez probablement "réponse" environ 90% des questions posées ici avec la même réponse. Bien sûr, vous ne voudriez pas être aider n'importe qui, et vous n'auriez pas à faire le site mieux. Tous les choix de conception a une raison derrière tout ça (je l'espère!) et ces raisons sont la peine de savoir. Je préfère laisser un peu douteux questions glisser à travers (non pas que je pense que celui-ci s'inscrit dans cette catégorie) que nix questions utiles qui peuvent aider les autres en bas de la route.
Dans un pincement, si vous souhaitez charger un registre de segment, sans toucher à l'un des registres, vous pouvez toujours faire du "push immédiate / pop registre de segment' de la séquence.
OriginalL'auteur Rijo Joseph | 2013-09-29
Vous devez vous connecter pour publier un commentaire.
Rappelez-vous que la syntaxe du langage d'assemblage (assemblage) est à seulement lisible par l'homme, la façon d'écrire du code machine. Les règles de ce que vous pouvez faire en code machine dépend de la façon dont le processeur de l'électronique ont été conçus, non pas sur ce que l'assembleur syntaxe pourrait facilement prendre en charge.
Donc, simplement parce qu'il semble que vous pourriez écrire
mov DS, [5000h]
et que, conceptuellement, il ne semble pas comme il ya une raison pourquoi vous ne devriez pas être en mesure de le faire, c'est vraiment au sujet de "est-il un mécanisme par lequel le processeur peut charger un registre de segment à partir d'un emplacement de la mémoire du contenu?"Dans le cas de 8086 assemblée, je me dis que la raison est simplement que les ingénieurs n'a tout simplement pas de créer un chemin électrique qui pourrait nourrir un signal à partir de la mémoire de données d'e/S lignes de lignes à écrire dans les registres de segment.
Pourquoi? J'ai plusieurs théories, mais aucune autorité de connaissances.
La raison la plus probable est tout simplement une simplification de la conception: il faut câblage supplémentaire et de portes à le faire, et c'est une des rares assez de fonctionnement (c'est le années 70) que c'est pas la peine de l'immobilier dans la puce. Ce n'est pas surprenant, le 8086 déjà allés à la mer permettant à toute personne de la normale registres d'être connecté à l'ALU (unité arithmétique et logique) qui permet de tout enregistrer pour être utilisé comme un accumulateur. Je suis sûr que ce n'était pas bon de le faire. La plupart des processeurs à la fois seulement permis à un registre (la accumulateur) pour être utilisé à cette fin.
Il est également possible qu'en permettant à un registre de segment à être écrite à partir d'une lecture de la mémoire a entraîné plusieurs étrange cas limites qui ont été dur pour obtenir le droit dans le circuit. Après tout, le registre de segment à être écrite peut être utilisée pour l'adresse de l'opérande source.
Autant que les crochets, vous avez raison. Disons position de mémoire 5000h contient le nombre 4321h.
mov ax, 5000h
met la valeur 5000h en ax, alors quemov ax, [5000h]
charges 4321h de la mémoire dans les ax. Essentiellement, les crochets à l'acte comme*
opérateur de déréférencement de pointeur dans C.Juste pour souligner le fait que l'assemblée est une vision idéalisée de l'abstraction de ce que le code machine peut le faire, vous ne devriez noter que les deux variantes ne sont pas les mêmes de l'enseignement, avec des paramètres différents, mais complètement différents opérateurs. Ils ont pu s'en servir – dire –
MOV
pour la première etMVD
(Déplacer Directement adressée mémoire) pour le deuxième opcode, mais ils doivent avoir décidé que le support de la syntaxe a été plus facile pour les programmeurs de se souvenir.S'ils allaient à l'utilisation de différents codes mnémoniques pour load/store vs reg-reg mouvement de données, l'aurait pu être comme tout le monde et utilisé
LDsomething
etSTsomething
que les mnémoniques. Mais notez quemov r16, r/m16
est la même opcode si la source est une mémoire ou d'un autre registre. Donc, ce n'est pas vraiment un bon exemple. Faire mov-immédiate séparé mnémonique du reste aurait plus de sens, parce que les opcodes pourmov r16, imm16
sont toujours les mêmes instructions. Grande réponse, mais malheureux choix de l'exemple 😛En plus d'avoir de fil d'un chemin de données d'opérande mémoire ou d'aller directement dans les registres de segment, les décodeurs aurait à reconnaître que l'opcode et d'activer la gestion de ce cas particulier de l'acheminement des données. Plus d'opcodes signifie plus de transistors, au-delà même de l'autre considération.
"le registre de segment à être écrite peut être utilisée pour l'adresse de l'opérande source" — ce n'est pas plausible. On pourrait dire la même chose sur les instructions existantes comme
mov bp,[bp]
.plus important encore, cette réponse est totalement faux.
mov ds, [5000h]
est encodeable: l'opcode estmov Sreg, r/m16
. Une immédiate n'est pas encodeable (mov ds, 4321h
) parce que aurait besoin d'un opcode différent, mais l'opcode nous n'avons pour le déménagement à Sreg (8E /r
) tient un registre ou mémoire de la source. Tout est une question de opcode espace de codage / décodage de la complexité, de ne pas le segment reg être utilisé au cours de l'instruction, parce que c'est le cas pourmov ds, [5000h]
.OriginalL'auteur Euro Micelli
Sur les registres de segment
Les registres de segment ne sont pas les mêmes (niveau matériel) que les registres. Bien sûr, comme Mike W dit dans les commentaires, la raison exacte pour laquelle vous ne pouvez pas passer directement de la valeur immédiate dans le registre de segment n'est connu que par les développeurs Intel. Mais je suppose que c'est parce que le design est simple de cette façon. Notez que ce choix n'affecte pas les performances du processeur, parce que le registre de segment opérations sont très rares. Ainsi, une instruction plus, un de moins n'est pas important du tout.
Sur la syntaxe
Par tous les implémentations de l'assembleur x86 syntaxe,
mov reg, something
déplace l'immédiat nombresomething
au registrereg
. Par exemple:Fermeture le nombre entre crochets signifie que le contenu de la mémoire avec cette adresse est déplacé vers le registre:
mov ax, myvar \n... myvar dw 1234
charge 1234 dansax
dans MASM (et TASM en mode par défaut). Otoh, que, FASM et de MSNA avez bien fait (de façon plus cohérente), se débarrasser de laoffset
mot-clé.OriginalL'auteur johnfound
x86 code machine n'a qu'un opcode pour se déplacer-à-Sreg. Que opcode
8E /r
mov Sreg, r/m16
, et permet à un registre ou mémoire source (mais pas immédiat).Contrairement à certaines allégations dans d'autres réponses,
mov ds, [5000h]
fonctionne très bien, en supposant que les 16 octets à l'adresse5000h
tenir une utile segment de la valeur pour le mode dans lequel vous êtes. (En mode réel où ils sont utilisés directement comme des nombres vs protégé où Sreg valeurs sont des sélecteurs d'indice de la LDT /GDT).x86 utilise toujours un opcode différent de la forme d'une instruction (avec une constante codée dans le cadre du code machine) vs le registre/mémoire de la version source. par exemple,
add eax, 123
assemble pour un opcode différent deadd eax, ecx
. Maisadd eax, [esi]
est la même opcodeadd r, r/m32
opcode commeadd eax, ecx
, seulement d'une autre ModR/M octets.MSNA de cotation, à partir de
nasm sreg.asm -l/dev/stdout
, le montage d'une télévision binaire en mode 16 bits et la production d'une liste.J'ai édité à la main pour séparer les octets dans
opcode modrm extra
. Ce sont tous d'un octet opcodes (sans aucun supplément de opcode bits d'emprunt de l'espace dans le /r champ de la ModRM octet), donc il suffit de regarder le premier octet de voir ce que l'instruction qu'il est, et de l'avis lorsque deux instructions partagent le même opcode.Soutenir un
mov Sreg, imm16
encodage aurait besoin d'un opcode. Ce serait prendre un supplément de transistors pour 8086 à décoder, et il faudrait utiliser plus d'opcode espace de codage laissant moins de place pour les extensions futures. Je ne suis pas sûr de ce qui était considéré comme plus important par l'architecte(s) de l'8086 ISA.Avis que 8086 a spécial
mov AL/AX, moffs
opcodes qui permettent d'économiser sur 1 octet lors du chargement de l'accumulateur à partir d'une adresse absolue. Mais il ne pouvait pas épargner un opcode pourmov
-immédiate à Sreg? Cette décision de conception est de bon sens. Combien de fois avez-vous besoin de recharger un registre de segment? Très rarement, et dans la vraie grands programmes, souvent, il ne serait pas avec une constante (je pense). Mais dans le code à l'aide de données statiques, vous peut-être, le chargement, le stockage de l'accumulateur à une adresse fixe à l'intérieur d'une boucle. (8086 avait très faibles code-fetch, donc le code-taille = vitesse la plupart du temps).Aussi garder à l'esprit que vous pouvez utiliser
mov Sreg, r/m16
pour assembler-les constantes de temps avec seulement un supplément d'instruction (commemov ax, 4321h
). Mais si nous avions seulement eumov Sreg, imm16
, variable d'exécution valeurs de segment aurait exigé self-modifying code. (Alors, évidemment, vous ne voudriez pas laisser de côté lar/m16
version de la source.) Mon point est que si vous allez seulement d'en avoir un, il va certainement être le registre/mémoire de la version source.8B F0
commemov si, ax
. Pas sûr de savoir comment convaincre les MSNA pour émettre de cette variante.Aussi, je n'arrive pas à obtenir ce supplément d'instruction que vous entendez dans la première phrase du dernier paragraphe. - Vous voulez dire que l'on casser un registre?
D'accord. De GAZ à AT&T syntaxe pourrait utiliser
mov.s %ax, %si
au lieu demov %ax, %si
pour sélectionner la face de l'encodage.Je voulais dire un mov-immédiate. mis à jour. Merci pour la lecture à travers le point de sortir des trucs que j'ai quitté incertaine.
En fait, même avec le GAZ Intel syntaxe que vous pouvez utiliser
mov.s
, viens de vérifier.OriginalL'auteur Peter Cordes
Je me souviens de la lecture de la voie de la raison de retour dans la journée. Je n'ai pas le document en face de moi, alors s'il vous plaît pardonnez ma main en agitant.
Chargement d'un registre de segment à partir d'un emplacement mémoire ou d'une constante implique des cycles de mémoire. Si l'alignement de la mémoire est foiré, la lecture d'une valeur 16 bits peut prendre deux cycles de mémoire. Entre les deux cycles, la valeur du registre de segment n'est pas valide. Maintenant, imaginez que vous êtes déconner avec le registre de Segment de Pile et une interruption se produit: voici votre charrette à bras; profiter de la balade!
mov ds,[5000H]
est encodeable, maismov ds, 5000H
ne l'est pas. Si il y avait unmov Sreg, imm16
opcode (il n'y en a pas), il ne pouvait pas exécuter jusqu'à ce que tous ses octets ont été récupérés dans le décodage de la mémoire tampon. Donc, la seule instruction vous proposons un problème avec est l'une des formes que est encodeable.OriginalL'auteur trindflo