Majelis - Array

Kita telah membahas bahwa arahan definisi data ke assembler digunakan untuk mengalokasikan penyimpanan untuk variabel. Variabel juga dapat diinisialisasi dengan beberapa nilai tertentu. Nilai yang diinisialisasi dapat ditentukan dalam bentuk heksadesimal, desimal, atau biner.

Misalnya, kita dapat mendefinisikan variabel kata 'bulan' dengan salah satu cara berikut -

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

Arahan definisi data juga dapat digunakan untuk mendefinisikan array satu dimensi. Mari kita definisikan deretan angka satu dimensi.

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

Definisi di atas menyatakan larik enam kata yang masing-masing diinisialisasi dengan angka 34, 45, 56, 67, 75, 89. Ini mengalokasikan 2x6 = 12 byte ruang memori berturut-turut. Alamat simbolis dari nomor pertama adalah ANGKA dan nomor kedua adalah ANGKA + 2 dan seterusnya.

Mari kita ambil contoh lainnya. Anda dapat menentukan larik bernama inventaris ukuran 8, dan menginisialisasi semua nilai dengan nol, seperti -

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

Yang bisa disingkat menjadi -

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

Direktif TIMES juga dapat digunakan untuk beberapa inisialisasi ke nilai yang sama. Menggunakan TIMES, array INVENTORY dapat didefinisikan sebagai:

INVENTORY TIMES 8 DW 0

Contoh

Contoh berikut mendemonstrasikan konsep di atas dengan mendefinisikan larik 3 elemen x, yang menyimpan tiga nilai: 2, 3, dan 4. Ini menambahkan nilai dalam larik dan menampilkan jumlah 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

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

9