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