- ベストアンサー
アセンブリ言語のメモリへの即値の転送について
エディタMASM32を使用しています。 本に特定のメモリを指定して、即値を転送できると書いてありました。 →例 MOV [0200H], BYTE PTR FFH しかし、この通り記述しても、コンパイルする過程で error A2001: immediate operand not allowed となってエラーがでます。ちなみに上の[0200H]の部分をラベルに置き換えた場合はエラーは出ませんした。 質問 メモリの番地を直接指定して即値を転送することは不可能なのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2です。DOSアセンブラを引退して9年もたちあまり的確な指摘ができず申し訳ありませんン。 あとはメモリのセグメント指定はうまくいっているのでしょうか? 規則はもはや覚えていないのでが、 mov byte ptr DS:[200H],0ffh などはどうでしょう。 ラベルだとセグメントが指定されていると思うので。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
たぶんそれで正解です>#3. ラベルを使ったものと (再配置できないことを除いて) 同じコードが出ることを ml で確認しました.
お礼
たぶんそれで正解です>#3. ラベルを使ったものと (再配置できないことを除いて) 同じコードが出ることを ml で確認しました >>わざわざご確認頂いて有難うございました。おかげで僕も、コンパイルに成功しました。有難うございました。
- endlessriver
- ベストアンサー率31% (218/696)
#1さんに加えて、「FFH」だとラベルになります。即値ですと「0FFH」「0ffh」などと書くはずです。
補足
回答有難うございます。 >>「FFH」だとラベルになります。即値ですと「0FFH」「0ffh」などと書くはずです。 おっしゃる通りでしです。これは、質問の例の書き方のミスです。実際のプログラムは0FFhと記述しています。申し訳ありません。しかしながら。それでも尚且つエラーが出ます。 ちなみにimmediate operand not allowed のエラーとは即値を入れることのできない、ディスティネーションオペラントが設定されたという意味だそうです。 参照URL→ http://msdn.microsoft.com/ja-jp/library/6kzwh998(v=vs.71).aspx つまり、質問の例をとると「[0200h]番地のメモリーには即値は入れることができないですよ」の意味であると私なりに解釈しています。しかし、この解釈が仮に正しかったとしても実際のメモリー←即値の入れ方は今だ不明です。
- Tacosan
- ベストアンサー率23% (3656/15482)
BYTE PTR ってここに書いていいんだっけ?
補足
回答有難うございます。BYTE PTRの書き方は2種類ありまして、ディスティネーションオペラントの前に書くものとソースオペラントの前に書くものがあります。質問の例をとると、[0200h]の前に書くタイプと0FFhの前に書くタイプです。それぞれの書き方は使用しているコンパイラによって使い分けます。 →参照UPR http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html 私の使用しているコンパイラはソースオペラントの前に、BYTE PTRをつけるタイプのものですですのでMov ラベル,即値の形でコンパイルできます。よって、BYTE PTRの書き方が原因ではないようです。申し訳ありません。
お礼
>>#2です。DOSアセンブラを引退して9年もたちあまり的確な指摘ができず申し訳ありませんン。 とんでもないです。回答にご協力頂いてるだけでも大変嬉しく思います。 DS:をつけることで、コンパイルに成功すると共に、また一つ勉強になりました。有難うございました。