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:
*********