Assembly-programming-assembly-arrays

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

アセンブリ-配列

アセンブラへのデータ定義ディレクティブは、変数のストレージを割り当てるために使用されることをすでに説明しました。 変数は特定の値で初期化することもできます。 初期化された値は、16進、10進、または2進形式で指定できます。

たとえば、次のいずれかの方法で単語変数「月」を定義できます-

MONTHS  DW  12
MONTHS  DW  0CH
MONTHS  DW  0110B

データ定義ディレクティブは、1次元配列の定義にも使用できます。 数値の1次元配列を定義しましょう。

NUMBERS DW  34,  45,  56,  67,  75, 89

上記の定義は、それぞれ34、45、56、67、75、89の数字で初期化された6ワードの配列を宣言しています。 これにより、2x6 = 12バイトの連続したメモリ空間が割り当てられます。 最初の番号のシンボリックアドレスはNUMBERSになり、2番目の番号のシンボリックアドレスはNUMBERS + 2などになります。

別の例を取り上げましょう。 サイズ8のinventoryという名前の配列を定義し、すべての値をゼロで初期化できます。

INVENTORY   DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0

次のように短縮することができます-

INVENTORY   DW  0, 0 , 0 , 0 , 0 , 0 , 0 , 0

TIMESディレクティブは、同じ値への複数の初期化にも使用できます。 TIMESを使用すると、INVENTORY配列は次のように定義できます。

INVENTORY TIMES 8 DW 0

次の例は、3要素の値2、3、4を格納する3要素配列xを定義することにより、上記の概念を示しています。 それは配列に値を追加し、合計9を表示します-

section .text
   global _start   ;must be declared for linker (ld)

_start:

   mov  eax,3      ;number bytes to be summed
   mov  ebx,0      ;EBX will store the sum
   mov  ecx, x     ;ECX will point to the current element to be summed

top:  add  ebx, [ecx]

   add  ecx,1      ;move pointer to next element
   dec  eax        ;decrement counter
   jnz  top        ;if counter not 0, then loop again

done:

   add   ebx, '0'
   mov  [sum], ebx ;done, store result in "sum"

display:

   mov  edx,1      ;message length
   mov  ecx, sum   ;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
global x
x:
   db  2
   db  4
   db  3

sum:
   db  0

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

9