dポイントプレゼントキャンペーン実施中!

アセンブラでの記述について教えてください。

CMDでのアセンブリで、

mov dx , [0200] (0200へは'ab'を代入しておく)
mov [0400] , dx

とすれば0400番地へabが複写されるのですが、これをmasmで

mov dx , data1
mov data2 , dx

data1 db 'ab'
data2 db '00'

とすれば「invalid instruction operands」というエラーが生じます。
dataのアドレス値を他に格納してから複写すると上手くいくのですが、お聞きしたいのは上記の違いです。

[0200]はmasmだと data1
また、
[0400]はmasmだと data2 

実際のアドレス値は当然違いますが、これは理屈的に同じとならないのでしょうか?
なぜmasmの場合だと、

mov si , offset data1
mov di , offset data2
mov al , [si]
mov [di] , al

などのように、わざわざアドレス値を用いて遠まわしにしなければならないのでしょうか?
どなたかご教授のほどをお願いします。

A 回答 (1件)

データサイズが違うからです。


dxは16ビットですが、data1はdb擬似命令により
定義されているので8ビットと解釈されます。
movにせよcmpにせよデータサイズが違う操作は
できません。

こういう時はオーバライドします。
mov dx,word ptr data1

尚、mov dx,[200]とかmov dx,[bx]の場合は
受け取り側、あるいは送り出し側のオペランドで
勝手にサイズを合わせるので問題がありません。
おまけ
16ビットのデータ交換ではaxを使うほうが命令が
1バイト少なくて済みます。条件分岐は前後に
飛べるバイトレンジが短いので、こういうケチり
かたも、必要なことがあります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

データサイズが原因であるとは、うかつにも気がつきませんでした。
とても納得できました。
文句なしのベストアンサーとさせて頂きます。

お礼日時:2010/10/12 15:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!