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"?
Réponses:
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),a
etld 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 dansax
et 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,la source
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
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,
la source
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
MOV
est 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
MOV
instructions 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
MOV
fait.Un coût énorme avec un gain nul explique facilement pourquoi l'instruction n'a pas été renommée.
la source