แอสเซมบลี - อาร์เรย์

เราได้พูดคุยกันแล้วว่าคำสั่งนิยามข้อมูลไปยังแอสเซมเบลอร์ใช้สำหรับการจัดสรรหน่วยเก็บข้อมูลสำหรับตัวแปร ตัวแปรยังสามารถเริ่มต้นด้วยค่าเฉพาะบางอย่าง ค่าเริ่มต้นสามารถระบุได้ในรูปแบบเลขฐานสิบหกฐานสิบหรือฐานสอง

ตัวอย่างเช่นเราสามารถกำหนดตัวแปรคำว่า 'เดือน' ด้วยวิธีใดวิธีหนึ่งดังต่อไปนี้ -

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

คำสั่งนิยามข้อมูลยังสามารถใช้สำหรับการกำหนดอาร์เรย์หนึ่งมิติ ให้เรากำหนดอาร์เรย์ของตัวเลขหนึ่งมิติ

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

คำจำกัดความข้างต้นประกาศอาร์เรย์หกคำแต่ละคำเริ่มต้นด้วยตัวเลข 34, 45, 56, 67, 75, 89 ซึ่งจะจัดสรรพื้นที่หน่วยความจำต่อเนื่อง 2x6 = 12 ไบต์ ที่อยู่สัญลักษณ์ของหมายเลขแรกจะเป็น NUMBERS และของตัวเลขที่สองจะเป็น NUMBERS + 2 เป็นต้นไป

ให้เรายกตัวอย่างอื่น คุณสามารถกำหนดอาร์เรย์ชื่อสินค้าคงคลังขนาด 8 และเริ่มต้นค่าทั้งหมดด้วยศูนย์เป็น -

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 องค์ประกอบ x ซึ่งเก็บค่าสามค่า: 2, 3 และ 4 จะเพิ่มค่าในอาร์เรย์และแสดงผลรวม 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