x86アセンブリ言語のMOV
命令を使用して、これらの方法でメモリオペランドをセグメントレジスタに移動できるのはなぜですか?mov ds、[bx]、mov ds、[2345H]が有効なのはなぜですか?
これらはなぜ有効ですか?
Mov DS,[Bx]
Mov DS,[2345H]
x86アセンブリ言語のMOV
命令を使用して、これらの方法でメモリオペランドをセグメントレジスタに移動できるのはなぜですか?mov ds、[bx]、mov ds、[2345H]が有効なのはなぜですか?
これらはなぜ有効ですか?
Mov DS,[Bx]
Mov DS,[2345H]
これらはMOV命令の有効な形式であるためです。 (私は制御およびデバッグレジスタから/への移動を省略しています。詳細についてはお使いのCPUのマニュアルを参照してください)MOV命令は、次の移動ができます:
general-purpose register <- integer constant
memory <- integer constant
general-purpose register <- general-purpose register
memory <- general-purpose register
general-purpose register <- memory
segment register <- general-purpose register
segment register <- memory
general-purpose register <- segment register
memory <- segment register
CPUはMOV命令で、次の動きをサポートしていませんが。
segment register <- segment register
segment register <- integer constant
memory <- memory
理由がわからないのであれば、CPUの作業が簡単になります。 CPUがデコードする必要のある命令が少なくなり、同様に、可能なオペランドエンコードが少なくなります。命令が多くても1つのメモリ位置にアクセスできるときは、処理する特別なケースも少なくなる可能性があります。そして、ほとんどの指示はそうです。これにより、設計が簡単になり、CPUも安くなります。 2つのメモリ位置にアクセスできる命令がいくつかありますが、それらは非常に特殊化されており、メモリ位置はあまり柔軟ではありません(特定のレジスタに関連付けられています)。 PUSHとPOPはメモリとスタックの間でデータを移動できます(スタックはメモリです)。 MOVSB/MOVSW/MOVSDは、DS:(E | R)SIのメモリからES:(E | R)DIのメモリにデータを移動します。
アセンブラでは、CPUが実行できないことを知っているため、MOV WORD [BX], [SI]
は使用できません。CPUにはそのような命令がありません。それはあなたのためにそれについて今知っているすべてです。
そのマシンコード。 MOVは機械コマンドです。 –
なぜそうではありませんか? 'MOV Sreg、r/m16'はinsn setリファレンスマニュアルにリストされています。マシンコードエンコーディングは、通常のmod/rmバイトを使用して、ソースをレジスタまたはメモリのオペランドにすることができます。マニュアルへのリンクについては、[x86タグwiki](http://stackoverflow.com/tags/x86/info)を参照してください。 –
将来の読者にとって価値がないので、私はこの話題を話題として閉じようとしています。マニュアルは質問全体に完全に答えるので、RTFMだけです。 –