Pourquoi l'instruction de copie est-elle généralement nommée MOV?

23

Dans de nombreux assembleurs, une instruction de copie de valeur est généralement nommée "MOV" et sa description dans les manuels contient également généralement "déplacer" (cependant, d'autres mots peuvent être utilisés, comme "charger", "stocker", "extraire", etc. ) Il est rare de trouver un ISA ) qui ne respecte pas cette convention.

D'un autre côté, dans d'autres contextes, "déplacer" diffère de "copier" dans le sens où la source est détruite (par exemple, "mv" vs "cp" sous Unix, Move [F6] dans Norton Commander et les clones, etc. ) Le "déplacement" de l'assembleur a vraiment une "copie" sémantique, gardant la valeur source intacte.

J'ai trouvé que cela a commencé au moins depuis IBM 1401 (1959), mais IBM 360 a utilisé ce mot uniquement pour la copie en stockage, mais pas pour les opérations entre les registres et le stockage (qui utilisaient "charger" et "stocker") . Mais pourquoi est-il encore largement utilisé et non remplacé par "copier" ou "stocker"?

Netch
la source
5
Wikipédia dit : "Le mot déplacer pour cette opération est, à proprement parler, un terme impropre: il a peu à voir avec le concept physique de déplacer un objet de A vers B, le lieu A devenant alors vide; un MOV fait plutôt une copie de l'état de l'objet en A et écrase l'ancien état de B dans ce processus. Cela se reflète dans certains autres langages d'assemblage en utilisant des mots comme charger , stocker ou copier au lieu de déplacer. ".
Uwe Keim
@UweKeim hmm, j'ai cherché sur Google des explications avant la question mais je n'ai pas été nourri avec cet article. Quoi qu'il en soit, cela explique l'état actuel mais ne donne pas la moindre idée des vraies origines ...
Netch
2
@gnat J'avais voulu dire "Instruction Set Architecture", pas un bus ISA. Je l'ai réédité.
Netch
@Netch merci! J'ai en quelque sorte réussi à manquer ça dans une grande liste de désambiguïsations sur Wikipédia
moucher
1
Je doute qu'il y ait un moyen de savoir pourquoi on l'appelait à l'origine un "déplacement" au lieu de "copie", mais spéculer est amusant. Sur la page wikipedia pour le langage d'assemblage , il décrit MOV comme une opération pour "déplacer une copie des données", ce qui est une interprétation intéressante. Une autre possibilité est qu'en termes d'utilisation réelle de MOV, l'opération est conceptuellement un mouvement de données; que nous ne nous soucions plus de la source.
Ben Lee

Réponses:

10

Dans certains jeux d'instructions, il existe des instructions distinctes pour charger un registre de la mémoire, stocker un registre dans la mémoire ou transférer des choses entre les registres. Alors que certains formulaires en langage assembleur utilisent le verbe "charger" pour tout (par exemple, les mnémoniques Z80 de Zilog utilisent ld a,(1234h), ld (1234h),aet ld a,b), et certains utilisent le transfert "T" (par exemple le 6502 avec TXA pour "transférer X vers A"), certains utilisent "déplacer" pour que les opérations d'enregistrement pour enregistrer les distinguent des charges et des magasins. Si l'on a un format d'instructions comme le 68000 qui utilise le même formulaire d'instructions générales pour les opérations de registre à registre, de registre à mémoire, de mémoire à registre et même de mémoire à mémoire, le verbe "déplacer" est probablement un meilleur verbe à usage général que n'importe quelle alternative.

Je n'ai aucune idée des jeux d'instructions de mini-ordinateur ou d'ordinateur central avant le 8080, mais le 8080 utilisait "charger" et "stocker" pour la plupart des instructions d'accès à la mémoire et "mov" pour les instructions de registre à registre, mais la plupart des instructions qui pouvaient fonctionner sur un registre arbitraire de 8 bits pourrait également fonctionner sur "M", qui était l'emplacement mémoire adressé par HL, donc un "MOV" vers ou depuis "M" se comporterait en fait comme une charge ou un stockage.

Quant à la distinction entre "copier" et "déplacer", je soupçonne que cela a beaucoup à voir avec le fait que le code ne peut ni créer ni détruire des registres; ils existent juste. En décrivant le comportement de la séquence de code mov bx,ax / mov ax,1234, est-il plus logique de dire que la première instruction copie bx dans ax, et la deuxième instruction détruit la valeur dans axet la remplace par la valeur 1234, ou est-il plus logique de visualiser la première instruction comme ayant déplacé la valeur de bx vers ax (faisant de la valeur de ax un "indifférent"), et la deuxième instruction charge ax (qui n'avait pas été soucieux) avec 1234? Parfois, les registres source sont toujours significatifs après une instruction de transfert de registre, mais comme il n'y a rien dans le jeu d'instructions pour indiquer s'il le sera,

supercat
la source
Je n'ai aucune preuve à l'appui de votre réponse, mais cela semble certainement juste. Les opérations de chargement / stockage vont prendre un chemin différent dans le CPU / microcode en raison de la mémoire / du cache, mais le déplacement entre les registres peut être un cycle unique (pas besoin d'attendre sur les autres étapes du pipeline) et mérite donc d'être différencié. Mais cela n'explique pas le mouvement contre la copie ...
JBRWilkinson
D'accord. Prenons par exemple les périphériques d'entrée mappés en mémoire. La lecture d'un emplacement source peut le modifier, par exemple en supprimant l'élément que vous lisez d'une file d'attente matérielle, en le remplaçant par l'élément en file d'attente suivant. Cela ressemble à un mouvement plutôt qu'à une copie - la source ne détient plus cette information, seule la destination le fait. Et ce comportement n'est pas décidé par le CPU, il est décidé par ce périphérique mappé en mémoire.
Steve314
Les langages d'assemblage utilisent des mnémoniques «centrées sur le processeur». Autrement dit, tout est nommé du point de vue des registres du CPU. Ainsi, "charger" copie généralement une valeur dans un registre, tandis que "stocker" copie généralement une valeur d'un registre dans la mémoire. Comment appeler alors la copie d'une valeur d'un registre à un autre? "Move" est un choix évident. Si la même opération de microcode exécute les deux (comme dans le 68000), "déplacer" est un choix plus générique pour le chargement / stockage. "Copier" aurait pu être utilisé mais peut être redondant car il n'y a vraiment pas de véritable "mouvement", où la source est laissée vide.
DocSalvager
@DocSalvage: Si un registre 32 bits est un groupe fixe de 32 bascules ou verrous qui existeront toujours, "déplacer" n'a pas nécessairement de sens. Dans les architectures avec changement de nom de registre, cependant, un opérande "move" qui invaliderait également la source pourrait améliorer l'efficacité en libérant un registre virtuel. Je n'ai jamais entendu parler d'une telle chose, mais je ne connais aucune architecture conçue avec un changement de nom de registre en tête.
supercat
@supercat: dans le matériel informatique, tous les registres et tous les emplacements de mémoire contiennent une valeur à tout moment. Il n'y a en fait rien de tel que "null" ou "vide". Nous utilisons des conventions arbitraires pour signifier lorsque le contenu du registre ou de la mémoire n'est pas valide. Très souvent, nous laissons «0» signifier «nul» mais pas toujours. L'état "nul" d'un bloc de mémoire par exemple peut être indiqué par des adresses de début et de fin stockées dans un autre emplacement. Il existe également de nombreuses autres techniques. En fin de compte, les mnémoniques linguistiques sont arbitraires, bien que nous essayions l'option la plus largement comprise.
DocSalvager
0

Vous avez certainement raison. La plupart sinon toutes les instances d'une instruction mov sont en fait une copie.

Certains n'ont même pas de mov c'est une pseudo instruction pour

add dest=source+zero.

Comprenez également que la syntaxe ascii est arbitraire, le code machine signifie quelque chose et est défini et fixé pour ce processeur. La plupart sinon la plupart du temps, le créateur / fournisseur du processeur crée une syntaxe en partie pour définir le jeu d'instructions (code machine) et en partie pour définir une syntaxe qui fonctionne avec un outil qu'ils ont également créé ou mandaté pour convertir ce langage d'assemblage en machine code pour leur processeur. Vous pouvez certainement par exemple aller dans l'assembleur gnu (qui a tendance à faire son propre truc et ne pas suivre la syntaxe des vendeurs de processeur de toute façon) et ajouter une pseudo instruction de copie.

Cas d'utilisation: de nos jours, la plupart du code du langage d'assemblage est généré par le compilateur, et l'instruction mov est le plus souvent utilisée pour déplacer une valeur d'un registre à un autre afin que le registre source (emplacement de la mémoire, etc.) puisse être réutilisé. Pour des raisons de convention d'appel pour ce processeur ou parce que certaines instructions ou jeux d'instructions ne sont pas orthogonaux, vous devez donc déplacer les choses. Il y a certainement des moments où une copie d'une valeur est souhaitée et le mov peut être utilisé pour faire cette copie.

Je doute sérieusement que nous saurons jamais quel individu ou quelle équipe a proposé le terme en premier et pourquoi ils ont choisi de passer à la copie. Parce que nous nous y sommes habitués, nous avons tendance à le réutiliser avec chaque nouveau jeu d'instructions. Comme déjà mentionné, certains jeux d'instructions utilisent des instructions de chargement et de stockage basées sur un registre, où un opérande est un registre et l'autre une adresse, et ne déplace que le registre pour enregistrer les cas. Et d'autres jeux d'instructions utilisent mov pour le registre ou mem pour l'un ou l'autre opérande. Bien que vous puissiez certainement ajouter une copie à n'importe quel / plusieurs assembleurs open source, il sera plus difficile de tirer parti de son utilisation. Si vous travaillez quelque part où vous avez le contrôle sur la syntaxe d'origine (travaillez pour un endroit faisant un nouveau processeur) où vous pouvez dicter le registre pour enregistrer le déplacement est appelé copie,

old_timer
la source
-4

Remplacer une instruction signifie rompre la compatibilité descendante. Un assembleur avec la nouvelle syntaxe ne pourra pas assembler le code écrit avec l'ancienne syntaxe - à moins que ce code n'utilise pas cette instruction (et le seul endroit où vous verrez un code d'assembly qui n'utilise pas MOVest dans des exemples de syntaxe qui montrent d'autres instructions ...)

Les compilateurs génèrent généralement du code d'assembly et le transmettent automatiquement à l'assembleur, ils devront donc également être modifiés pour s'adapter au nouvel assembleur. Si un langage autorise l'assemblage en ligne, l'ancien code source qui utilise l'assembleur en ligne avec des MOVinstructions ne fonctionnera plus.

Donc, nous parlons d'une rupture de code gigantesque, et pour quoi faire? cela ne rendra pas le langage plus lisible, car contrairement à certains langages de haut niveau, vous n'avez aucune chance de dire ce qu'un code d'assembly fait sans connaître l'assembly, et si vous connaissez l'assembly, vous savez ce qu'il MOVfait.

Un coût énorme avec un gain nul explique facilement pourquoi l'instruction n'a pas été renommée.

Idan Arye
la source
3
comment cela répond-il à la question posée?
moucher
2
La seule phrase se terminant par un point d'interrogation est «Mais pourquoi est-elle encore largement utilisée et non remplacée par« copier »ou« stocker »?».
Idan Arye
2
Il n'explique pas pourquoi l'instruction a été nommée telle pour commencer, par d'innombrables ISA conçues à partir de zéro (c'est-à-dire sans contraintes de compatibilité descendante) sur plusieurs décennies. De plus, si un fournisseur souhaitait changer le mnémonique malgré la rétrocompatibilité, il pourrait fournir un alias et promouvoir son utilisation.
1
Que signifie "OP"? Et, je n'ai pas vu de véritable explication.
Netch
1
Je suis l'affiche originale et je dirai que la copie entre les cellules de mémoire dans S / 360 n'est pas "une opération légèrement différente" mais n'est qu'un cas particulier de la même copie. La question n'est donc toujours pas résolue.
Netch