ここにこのコードがありますが、構文に慣れていません。
STACK16_SIZE = 100h
stack16 db STACK16_SIZE dup (?)
これはスタックであるため、配列型の変数を宣言することを意味すると思いますが、よくdup
わかりません。dup
では、TASM とは正確には何を意味するのでしょうか。
STACK16_SIZE dup (?)
括弧内のデータを回で複製することを意味しますSTACK16_SIZE
。?, ?, ?, ?,
・・・(100h回)の書き込みに相当
括弧内のデータは「未初期化データ」です。つまり、メモリは割り当てられますが、ロード時に特定の値に設定されません。
アセンブリは、配列の「型」を提供しません。存在する場合は、データを検査するときに使用するデバッガー専用です。ただし、このコード スニペットのstack16
は、バイトのメモリ ブロックを開始するアドレスを持つシンボルです。これは直観に反し、微妙なバグの原因となる可能性があります。CPU スタックの場合、実際には 16 ビット ワード ( dw
) または 32 ビット ワード ( )として定義する必要がありますdd
。
?
特定の値がない、初期化されていないことを意味します。DUP
重複を意味します。
したがって、初期化されていない 100h バイトが得られます。
別の例から始めましょう。20 DUP (0)
「ゼロの20個の複製」と読むことができます。式全体INPUTSTR DB 20 DUP (0)
は と同等INPUTSTR DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
です。
現在、 「初期化されて?
いない値」を意味するため、初期化され20 DUP (?)
ていない20バイトが得られます。そして、あなたが持っているこの特定のケースでは、初期化されていないバイトSTACK16_SIZE DUP (?)
を取得します。STACK16_SIZE
この構文は TASM 固有ではありません。MASM もそれをサポートしています。Microsoftの公式 MASM リファレンスを参照してください。