0

int で印刷するために、バイト配列の最後に「$」を付けたいのですが、masm を使用してこのコードで試しました。

.MODEL small
.STACK 200h
.data
m2 db "gggg"
.code
_start:
    mov ax,@data
    mov ds,ax 
    m3 db m2,"$"
END _start

しかし、私にこのエラーを与えます:

 error A2071: initializer magnitude too large for specified size

このコードは本当ですか?これを行う方法はありますか?

4

1 に答える 1

2

db異なるオブジェクトを結合または連結する魔法の演算子ではありません。これは、アセンブラにスペース (メモリ) を静的に割り当てるように指示するディレクティブです。ここでは、続くリスト内のバイト値の固定数に対して、それらの値で初期化します。したがって、m2 db "gggg"それぞれが文字 g の ASCII コードである 4 バイトに置き換えられます。

m2バイト値ではありません。これは、オブジェクトのラベル、名前、およびアドレスです。通常、このラベルの値 (アドレス) は 1 バイトに収まりません (そのため、エラーが発生します)。m2inのアドレスは必要ありません。 ,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 が命令を実行する場所からデータを移動する必要があります。または、データを命令として解釈しようとするため、プログラムは機能しません。

于 2013-02-06T15:25:21.757 に答える