Assembly - Mảng

Chúng ta đã thảo luận rằng các chỉ thị định nghĩa dữ liệu cho trình hợp dịch được sử dụng để cấp phát bộ nhớ cho các biến. Biến cũng có thể được khởi tạo với một số giá trị cụ thể. Giá trị khởi tạo có thể được chỉ định ở dạng thập lục phân, thập phân hoặc nhị phân.

Ví dụ: chúng ta có thể xác định biến từ 'tháng' theo một trong hai cách sau:

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

Các chỉ thị định nghĩa dữ liệu cũng có thể được sử dụng để xác định mảng một chiều. Hãy để chúng tôi xác định một mảng một chiều các số.

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

Định nghĩa trên khai báo một mảng sáu từ, mỗi từ được khởi tạo với các số 34, 45, 56, 67, 75, 89. Điều này phân bổ 2x6 = 12 byte không gian bộ nhớ liên tiếp. Địa chỉ tượng trưng của số đầu tiên sẽ là SỐ và địa chỉ của số thứ hai sẽ là SỐ + 2, v.v.

Hãy để chúng tôi lấy một ví dụ khác. Bạn có thể xác định một mảng có tên khoảng không quảng cáo có kích thước 8 và khởi tạo tất cả các giá trị bằng 0, như sau:

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

Có thể viết tắt là -

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

Chỉ thị TIMES cũng có thể được sử dụng cho nhiều lần khởi tạo với cùng một giá trị. Sử dụng TIMES, mảng INVENTORY có thể được định nghĩa là:

INVENTORY TIMES 8 DW 0

Thí dụ

Ví dụ sau minh họa các khái niệm trên bằng cách xác định mảng 3 phần tử x, mảng này lưu trữ ba giá trị: 2, 3 và 4. Nó thêm các giá trị trong mảng và hiển thị tổng 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

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

9