แอสเซมบลี - อาร์เรย์
เราได้พูดคุยกันแล้วว่าคำสั่งนิยามข้อมูลไปยังแอสเซมเบลอร์ใช้สำหรับการจัดสรรหน่วยเก็บข้อมูลสำหรับตัวแปร ตัวแปรยังสามารถเริ่มต้นด้วยค่าเฉพาะบางอย่าง ค่าเริ่มต้นสามารถระบุได้ในรูปแบบเลขฐานสิบหกฐานสิบหรือฐานสอง
ตัวอย่างเช่นเราสามารถกำหนดตัวแปรคำว่า 'เดือน' ด้วยวิธีใดวิธีหนึ่งดังต่อไปนี้ -
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