Assembly-programming-assembly-variables
アセンブリ-変数
NASMは、変数のストレージスペースを予約するためのさまざまな* defineディレクティブ*を提供します。 define assemblerディレクティブは、ストレージスペースの割り当てに使用されます。 1つ以上のバイトを予約および初期化するために使用できます。
初期化されたデータ用のストレージスペースの割り当て
初期化されたデータのストレージ割り当てステートメントの構文は-
[variable-name] define-directive initial-value [,initial-value]...
ここで、_variable-name_は各ストレージスペースの識別子です。 アセンブラは、データセグメントで定義された各変数名のオフセット値を関連付けます。
defineディレクティブには5つの基本的な形式があります-
Directive | Purpose | Storage Space |
---|---|---|
DB | Define Byte | allocates 1 byte |
DW | Define Word | allocates 2 bytes |
DD | Define Doubleword | allocates 4 bytes |
DQ | Define Quadword | allocates 8 bytes |
DT | Define Ten Bytes | allocates 10 bytes |
以下は、定義ディレクティブの使用例です-
choice DB 'y'
number DW 12345
neg_number DW -12345
big_number DQ 123456789
real_number1 DD 1.234
real_number2 DQ 123.456
次のことに注意してください-
- 文字の各バイトは、ASCII値として16進数で保存されます。
- 各10進数値は、16ビットのバイナリに自動的に変換され、16進数として保存されます。
- プロセッサは、リトルエンディアンのバイト順を使用します。
- 負の数は、その2の補数表現に変換されます。
- 短い浮動小数点数と長い浮動小数点数は、それぞれ32ビットまたは64ビットを使用して表されます。
次のプログラムは、定義ディレクティブの使用を示しています-
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
mov edx,1 ;message length
mov ecx,choice ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
choice DB 'y'
上記のコードをコンパイルして実行すると、次の結果が生成されます-
y
初期化されていないデータ用のストレージスペースの割り当て
reserveディレクティブは、初期化されていないデータ用のスペースを予約するために使用されます。 予約ディレクティブは、予約するスペースの単位数を指定する単一のオペランドを取ります。 各defineディレクティブには、関連する予約ディレクティブがあります。
予約ディレクティブの5つの基本的な形式があります-
Directive | Purpose |
---|---|
RESB | Reserve a Byte |
RESW | Reserve a Word |
RESD | Reserve a Doubleword |
RESQ | Reserve a Quadword |
REST | Reserve a Ten Bytes |
複数の定義
1つのプログラムに複数のデータ定義ステートメントを含めることができます。 たとえば-
choice DB 'Y' ;ASCII of y = 79H
number1 DW 12345 ;12345D = 3039H
number2 DD 12345679 ;123456789D = 75BCD15H
アセンブラは、複数の変数定義に連続したメモリを割り当てます。
複数の初期化
TIMESディレクティブは、同じ値への複数の初期化を許可します。 たとえば、サイズ9のmarksという名前の配列を定義し、次のステートメントを使用してゼロに初期化することができます-
marks TIMES 9 DW 0
TIMESディレクティブは、配列とテーブルの定義に役立ちます。 次のプログラムは、画面に9アスタリスクを表示します-
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,9 ;message length
mov ecx, stars ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
stars times 9 db '*'
上記のコードをコンパイルして実行すると、次の結果が生成されます-
*********