db
異なるオブジェクトを結合または連結する魔法の演算子ではありません。これは、アセンブラにスペース (メモリ) を静的に割り当てるように指示するディレクティブです。ここでは、続くリスト内のバイト値の固定数に対して、それらの値で初期化します。したがって、m2 db "gggg"
それぞれが文字 g の ASCII コードである 4 バイトに置き換えられます。
m2
バイト値ではありません。これは、オブジェクトのラベル、名前、およびアドレスです。通常、このラベルの値 (アドレス) は 1 バイトに収まりません (そのため、エラーが発生します)。m2
inのアドレスは必要ありません。 ,m3 db m2
の名前を持つオブジェクトの内容または値が必要です。m2
"gggg"
そのため、m3 db m2
魔法のように のようなものに拡張するつもりはありませんm3 db "gggg"
。プログラムのソース コードを操作してテキスト置換を実行する場合は、ソース コードがマシン コードに変換される前に、数値定数、文字列、および命令に展開できるマクロを使用できます。
ただし、この場合、別のスペースを明示的に割り当て (もちろん、db
それが可能です)、コード (命令) を記述"gggg"
して別の場所からそこにコピー"$"
し、最後に貼り付ける必要があります。
最後に、次のようなことはほとんど常に間違っています。
mov ds, ax
m3 db "gggg$"
これがマシンコードに変換されて実行されると、CPU はmov ds, ax
. 「gggg$」の 5 データバイトを命令バイトとして再解釈し、それらをデコードして実行しようとしますmov ds, ax
。CPU は、これらの 5 バイトがコードではなくデータであることを意図していたことを知りません。データ バイトは命令バイトと区別がつかず、それ自体は CPU 命令ではありません。パスカルや JavaScriptdb
のキーワードと同様に、アセンブラへの指示にすぎません。var
CPU が命令を実行する場所からデータを移動する必要があります。または、データを命令として解釈しようとするため、プログラムは機能しません。