質問を正しく理解し、事前定義されたサイズのデータ構造にスペースを静的に割り当てる必要がある場合は、行を置き換える必要があります
.align 48
次までに
times 48 db 0
これは、少なくとも NASM にとっては正しい方法です。いずれにせよ、アセンブラー マニュアルを参照して、この構成がアセンブリ コンパイラでサポートされていることを確認することをお勧めします。お使いのコンパイラが上記の例とまったく同じ表記法をサポートしていない可能性は非常に高いですが、いずれにしても同様のアナログをサポートします。'times' コマンドには次の構文があります。
times <number of repeats> <body>
where は、ボディが結果のコードに挿入され、標準のアセンブリ命令を含む回数を指定します。上記の例では、null への初期化を伴うメモリのバイトの割り当てです。したがって、たとえば、次の 2 つのコード セクションは同じです。
times 5 dd 012345678h
と
dd 012345678h
dd 012345678h
dd 012345678h
dd 012345678h
dd 012345678h
.align ディレクティブは、メモリ空間の割り当てに対して正しくありません。これには別の目的があります。次のコードまたはデータのチャンクを事前定義された値に合わせることです。たとえば、この場合
VAR1 db 0
.align 48
VAR2 db 0
VAR1 のアドレスが 0x1234 になる場合、コンパイラは、VAR2 のアドレスが 48 バイト境界に確実に配置されるように、未使用の 44 バイトを挿入します。この場合、アドレスは 0x1260 (0x1260 = 0x62 * 30 + 0 ) になります。正直なところ、コンパイラは通常、2 の累乗の値にのみ位置合わせを許可します。48 は 2 の累乗ではないため、上記の例のアセンブラをコンパイルするとエラーが発生する可能性が高くなります。そのため、.align ディレクティブによって割り当てられる未使用のバイト数を制御するのは困難です。0 からディレクティブ パラメーターまでの任意の値を指定できます。この値は、プログラムのソース コードの変更に応じて変化します。
But NOTE! This is an approach for the statical memory allocation during compilation time! If you need dynamical memory allocation in the run time, you need to write your own or find and adopt some third party memory allocator. If you program will run in the OS environment, you can request dynamical memory allocation by using OS API. (for example VirtualAlloc in WinAPI).