Assembly-programming-assembly-variables

提供:Dev Guides
移動先:案内検索

アセンブリ-変数

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 '*'

上記のコードをコンパイルして実行すると、次の結果が生成されます-

*********