Assembly - Các biến

NASM cung cấp nhiều define directivesđể dành không gian lưu trữ cho các biến. Chỉ thị xác định trình hợp dịch được sử dụng để phân bổ không gian lưu trữ. Nó có thể được sử dụng để dự trữ cũng như khởi tạo một hoặc nhiều byte.

Phân bổ không gian lưu trữ cho dữ liệu được khởi tạo

Cú pháp cho câu lệnh phân bổ lưu trữ cho dữ liệu được khởi tạo là:

[variable-name]    define-directive    initial-value   [,initial-value]...

Trong đó, tên-biến là định danh cho mỗi không gian lưu trữ. Trình hợp dịch liên kết một giá trị bù cho mỗi tên biến được xác định trong phân đoạn dữ liệu.

Có năm dạng cơ bản của chỉ thị xác định -

Chỉ thị Mục đích Không gian lưu trữ
DB Xác định Byte phân bổ 1 byte
DW Định nghĩa Word phân bổ 2 byte
DD Xác định Doubleword phân bổ 4 byte
DQ Xác định Quadword phân bổ 8 byte
DT Xác định mười byte phân bổ 10 byte

Sau đây là một số ví dụ về việc sử dụng chỉ thị định nghĩa:

choice		DB	'y'
number		DW	12345
neg_number	DW	-12345
big_number	DQ	123456789
real_number1	DD	1.234
real_number2	DQ	123.456

Xin lưu ý rằng -

  • Mỗi byte ký tự được lưu trữ dưới dạng giá trị ASCII của nó trong hệ thập lục phân.

  • Mỗi giá trị thập phân được tự động chuyển đổi thành tương đương nhị phân 16 bit và được lưu trữ dưới dạng số thập lục phân.

  • Bộ xử lý sử dụng thứ tự byte endian nhỏ.

  • Các số âm được chuyển thành biểu diễn phần bù 2 của nó.

  • Các số dấu phẩy động ngắn và dài được biểu diễn bằng 32 hoặc 64 bit, tương ứng.

Chương trình sau đây cho thấy việc sử dụng chỉ thị xác định:

section .text
   global _start          ;must be declared for linker (gcc)
	
_start:                   ;tell linker entry point
   mov	edx,1		  ;message length
   mov	ecx,choice        ;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
choice DB 'y'

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

y

Phân bổ không gian lưu trữ cho dữ liệu chưa được khởi tạo

Các lệnh dự trữ được sử dụng để dự trữ không gian cho dữ liệu chưa được khởi tạo. Các chỉ thị dự trữ lấy một toán hạng đơn xác định số lượng đơn vị không gian sẽ được dự trữ. Mỗi chỉ thị xác định có một chỉ thị dự trữ liên quan.

Có năm hình thức cơ bản của chỉ thị dự trữ -

Chỉ thị Mục đích
RESB Đặt trước một Byte
LÀM LẠI Đặt trước một từ
RESD Đặt trước một từ khóa
RESQ Đặt trước một Quadword
NGHỈ NGƠI Đặt trước Ten Byte

Nhiều định nghĩa

Bạn có thể có nhiều câu lệnh định nghĩa dữ liệu trong một chương trình. Ví dụ -

choice	  DB 	'Y' 		 ;ASCII of y = 79H
number1	  DW 	12345 	 ;12345D = 3039H
number2    DD  12345679  ;123456789D = 75BCD15H

Trình hợp dịch phân bổ bộ nhớ liền kề cho nhiều định nghĩa biến.

Nhiều lần khởi tạo

Chỉ thị TIMES cho phép nhiều lần khởi tạo với cùng một giá trị. Ví dụ: một mảng có tên là các dấu có kích thước 9 có thể được định nghĩa và khởi tạo bằng 0 bằng câu lệnh sau:

marks  TIMES  9  DW  0

Lệnh TIMES hữu ích trong việc xác định mảng và bảng. Chương trình sau đây hiển thị 9 dấu hoa thị trên màn hình -

section	.text
   global _start        ;must be declared for linker (ld)
	
_start:                 ;tell linker entry point
   mov	edx,9		;message length
   mov	ecx, stars	;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
stars   times 9 db '*'

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

*********