2016-04-15 7 views
-4

x86アセンブリ言語のMOV命令を使用して、これらの方法でメモリオペランドをセグメントレジスタに移動できるのはなぜですか?mov ds、[bx]、mov ds、[2345H]が有効なのはなぜですか?

これらはなぜ有効ですか?

Mov DS,[Bx] 

Mov DS,[2345H] 
+0

そのマシンコード。 MOVは機械コマンドです。 –

+0

なぜそうではありませんか? 'MOV Sreg、r/m16'はinsn setリファレンスマニュアルにリストされています。マシンコードエンコーディングは、通常のmod/rmバイトを使用して、ソースをレジスタまたはメモリのオペランドにすることができます。マニュアルへのリンクについては、[x86タグwiki](http://stackoverflow.com/tags/x86/info)を参照してください。 –

+4

将来の読者にとって価値がないので、私はこの話題を話題として閉じようとしています。マニュアルは質問全体に完全に答えるので、RTFMだけです。 –

答えて

2

これらは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にはそのような命令がありません。それはあなたのためにそれについて今知っているすべてです。