어셈블리-어레이

어셈블러에 대한 데이터 정의 지시문이 변수에 대한 저장소를 할당하는 데 사용된다는 점을 이미 논의했습니다. 변수는 특정 값으로 초기화 될 수도 있습니다. 초기화 된 값은 16 진수, 10 진수 또는 2 진 형식으로 지정할 수 있습니다.

예를 들어, 다음 방법 중 하나로 'months'라는 단어 변수를 정의 할 수 있습니다.

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가되고 두 ​​번째 숫자의 기호 주소는 NUMBERS + 2가됩니다.

다른 예를 들어 보겠습니다. 인벤토리 크기가 8 인 배열을 정의하고 모든 값을 0으로 초기화 할 수 있습니다.

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

다음 예제는 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