コピー命令の名前が通常MOVであるのはなぜですか?


23

非常に多くのアセンブラーでは、値のコピー命令には通常「MOV」という名前が付けられ、マニュアルの説明には通常「move」も含まれています(ただし、「load」、「store」、「extract」など、他の単語も使用できます) )この規則に従わないISAを見つけることはまれです。

一方、他のコンテキストでは、ソースが破棄されるという意味で「move」と「copy」は異なります(たとえば、Unixでは「mv」と「cp」、Norton CommanderとクローンではMove [F6] など)。 )アセンブラーの「移動」には、セマンティック「コピー」があり、ソース値をそのまま保持します。

これは少なくともIBM 1401(1959)以来始まっていることがわかりましたが、IBM 360はこの単語をストレージ内コピーにのみ使用し、レジスタとストレージ(「ロード」と「ストア」を使用)間の操作には使用しませんでした。しかし、なぜそれがまだ広く使用されており、「コピー」または「ストア」に置き換えられていないのですか?


5
ウィキペディアは次のように述べています。 Aのオブジェクトの状態。このプロセスでBの古い状態を上書きします。これは、移動の代わりにloadstorecopyなどの単語を使用することにより、他の一部のアセンブリ言語に反映されます。
ウーヴェ・ケイム

@UweKeimうーん、私は質問の前に説明のためにグーグルで検索しましたが、この記事には興味がありませんでした。とにかく、これは現在の状態を説明していますが、本当の起源の手がかりを与えません...
Netch

2
@gnat私はISAバスではなく、「命令セットアーキテクチャ」を意味していました。再編集しました。
Netch

@Netchありがとう!私は何とかそれを大きなリストにミスに管理ウィキペディアでdisambiguations
ブヨ

1
もともと「コピー」ではなく「ムーブ」と呼ばれていた理由を見つける方法はないと思いますが、推測するのは楽しいです。上のアセンブリ言語のためのウィキペディアのページ、それが面白い解釈である、「データのコピーを動かす」ための操作としてMOVを説明します。もう1つの可能性は、MOVの実際の使用に関して、操作は概念的にデータの移動であるということです。ソースについてはもう気にしません。
ベン・リー

回答:


10

一部の命令セットには、メモリからレジスタをロードしたり、メモリにレジスタを保存したり、レジスタ間でデータを転送したりするための個別の命令があります。一部のアセンブリ言語形式はすべてに「ロード」という動詞を使用し(ZilogのZ80ニーモニック使用ld a,(1234h)ld (1234h),aなどld a,b)、一部は「T」転送を使用します(例えば、「XからAへの転送」にTXAを備えた6502)。登録から登録操作をロードおよびストアと区別します。レジスタからレジスタ、レジスタからメモリ、メモリからレジスタ、さらにはメモリからメモリへの操作にも同じ一般的な命令形式を使用する68000のような命令形式がある場合、動詞「移動」はおそらく、他のどの選択肢よりも優れた汎用動詞です。

8080以前のミニコンピューターまたはメインフレームの命令セットについてはわかりませんが、8080はほとんどのメモリアクセス命令に「ロード」と「ストア」を使用し、レジスタ間命令に「mov」を使用しましたが、任意の8ビットレジスタでHLによってアドレス指定されたメモリ位置である「M」も操作できるため、「M」との間の「MOV」は実際にはロードまたはストアとして動作します。

「コピー」と「移動」の区別については、コードがレジスタを作成も破壊もできないという事実と関係があるのではないかと思います。それらはただ存在します。コードシーケンスの動作を説明する際に、mov bx,ax / mov ax,1234最初の命令がbxをaxにコピーし、2番目の命令が値in axを破棄して値1234に置き換えると言う方が理にかなっていますか、または最初の命令を表示する方が理にかなっています値をbxからaxに移動した命令(axの値を「do n't care」にします)、2番目の命令は1234でax(do n't care)をロードしますか?場合によっては、ソースレジスタはレジスタ転送命令の後でもまだ意味を持ちますが、命令セットにはそれがあるかどうかを示すものが何もないため、


あなたの答えを裏付ける証拠はありませんが、確かに正しいように聞こえます。ロード/ストア操作は、メモリ/キャッシュに移動するため、CPU /マイクロコードで異なるパスを使用しますが、レジスタ間を移動するのはシングルサイクルである可能性が高く(他のパイプラインステージで待機する必要はない)、差別化する価値があります。しかし、これは...移動-VS-コピーを説明していない
JBRWilkinson

同意した。たとえば、メモリマップされた入力デバイスを検討してください。ソースの場所を読み取ると、ソースの場所を変更できます。たとえば、ハードウェアキューから読み取ったアイテムを破棄し、次のキューに入れられたアイテムに置き換えます。それはコピーではなく移動のように聞こえます-ソースはもはやその情報を保持せず、宛先のみが保持します。そして、その動作はCPUによって決定されるのではなく、メモリマップされたデバイスによって決定されます。
Steve314

アセンブリ言語は、「CPU中心」のニーモニックを使用します。つまり、すべての名前はCPUのレジスターの観点から付けられます。したがって、「ロード」は通常、値をレジスタにコピーしますが、「ストア」は通常、レジスタからメモリに値をコピーします。次に、あるレジスタから別のレジスタに値をコピーすると呼ぶのは何ですか?「移動」は当然の選択です。同じマイクロコード操作で両方を実行する場合(68000など)、「移動」はロード/ストアのより一般的な選択肢です。「コピー」を使用することもできますが、ソースが空のままの真の「移動」のようなものは実際にはないため、冗長になる可能性があります。
DocSalvager

@DocSalvage:32ビットのレジスタが、常に存在する32個のフリップフロップまたはラッチの固定された束である場合、「移動」は必ずしも意味をなさない。ただし、レジスタの名前を変更するアーキテクチャでは、ソースを無効にする「移動」オペランドを使用すると、仮想レジスタを解放して効率を向上させることができます。そのようなことが行われたことは聞いたことがありませんが、レジスタ名の変更を念頭に置いて設計されたアーキテクチャは知りません。
supercat

@supercat:コンピューターハードウェアでは、すべてのレジスターとすべてのメモリー位置に常に値が含まれています。実際には、「null」や「empty」などはありません。レジスタまたはメモリの内容が無効であることを示すために、任意の規則を使用します。多くの場合、「0」は「null」を意味しますが、常にではありません。たとえば、メモリブロックの「null」状態は、別の場所に保存されている開始アドレスと終了アドレスによって示されます。他にも多くのテクニックがあります。最終的には、最も広く理解されているオプションを試しますが、言語ニーモニックはare意的です。
DocSalvager

0

あなたは確かに正しいです。mov命令のすべてではないにしても、ほとんどのインスタンスは実際にはコピーです。

いくつかは実際にmovさえ持っていません。それは疑似命令です

add dest=source+zero.

また、ASCII構文は任意であり、マシンコードは何かを意味し、そのプロセッサに対して定義および修正されることも理解してください。プロセッサの作成者/ベンダーは、命令セット(マシンコード)を定義する構文と、アセンブリ言語をマシンに変換するために作成または委託したツールで動作する構文を定義する構文を作成します。プロセッサのコード。たとえば、確かにgnuアセンブラ(独自の処理を行う傾向があり、とにかくプロセッサベンダーの構文に従わない)に進み、copy疑似命令を追加できます。

ユースケース:最近では、ほとんどのアセンブリ言語コードはコンパイラーによって生成され、mov命令は、ソースレジスタ(メモリの場所など)を再利用できるように、実際に値をあるレジスタから別のレジスタに実際に移動するために使用されます。そのプロセッサの呼び出し規約の理由、または一部の命令または命令セットが直交していないため、物事を移動する必要があります。確かに、値のコピーが必要な場合があり、movを使用してそのコピーを作成できます。

私が真剣に疑問に思うのは、個人やチームが最初にこの用語を思いついた理由と、彼らがなぜコピーよりも移動を選んだのかを知ることです。慣れてきたので、新しい命令セットごとに再利用する傾向があります。既に述べたように、一部の命令セットは、1つのオペランドがレジスタで、もう1つのオペランドがアドレスであるレジスタベースのロードおよびストア命令を使用します。また、他の命令セットでは、レジスタにmovを使用するか、いずれかのオペランドにmemを使用します。コピーを任意の/多くのオープンソースのアセンブラーに追加することは確かにできますが、その使用法を理解するのはより困難です。元の構文(新しいプロセッサを作成する場所の作業)を制御できる場所で作業し、レジスタからレジスタへの移動を指示できる場合はコピーと呼ばれ、


-4

命令を置き換えるとは、後方互換性を壊すことを意味します。新しい構文のアセンブラは、古い構文で記述されたコードをアセンブルできません-そのコードがその命令を使用しない限り(そして、使用しないアセンブリコードが表示される唯一の場所MOVは構文の例です他の指示を表示します...)

コンパイラは通常、アセンブリコードを生成し、それを自動的にアセンブラに渡します。そのため、新しいアセンブラに合わせて修正する必要があります。言語でインラインアセンブリが許可されている場合、インラインアセンブラとMOV命令を使用する古いソースコードは機能しなくなります。

だから、私たちは巨大なコード破損について話している、そして何のために?いくつかの高水準言語とは異なり、アセンブリを知らなくてもアセンブリコードが何をするかを伝える機会がなく、アセンブリを知っている場合は何をするかを知っているため、言語が読みやすくなりませんMOV

ゲインがゼロの膨大なコストは、命令の名前が変更されない理由を簡単に説明します。


3
これは質問にどう答えますか?
ブヨ

2
疑問符で終わる唯一の文は「しかし、なぜそれがまだ広く使用されており、「コピー」または「ストア」に置き換えられないのですか?」です。
イダンアリー

2
何十年にもわたってゼロから設計された無数のISA(つまり、後方互換性の制約なし)によって、命令が最初から命名された理由を説明していません。また、下位互換性にもかかわらず、ベンダーがニーモニックを変更したい場合は、エイリアスを提供し、その使用を促進できます。

1
「OP」とは何の略ですか?そして、私は本当の説明を見ていません。
Netch

1
私は元のポスターであり、S / 360のメモリセル間のコピー「わずかに異なる操作」ではなく、同じコピーの特殊なケースにすぎないことを述べます。質問はまだ解決されていません。
Netch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.