2️⃣Variables
Allocating Storage Space for Initialized Data
Syntax để phân bổ bộ nhớ cho dữ liệu được khởi tạo là:
[variable-name] define-directive initial-value [,initial-value]...
Where, variable-name is the identifier for each storage space. The assembler associates an offset value for each variable name defined in the data segment.
Trong đó, variable-name là tên biến (mã định danh) cho mỗi không gian lưu trữ. Nasm liên kết một offset cho mỗi tên biến được xác định trong .data segment.
Có 5 dạng cơ bản để khai tạo kiểu dữ liệu:
DB
Define Byte
allocates 1 byte = 8 bits
DW
Define Word
allocates 2 bytes = 16 bits
DD
Define Doubleword
allocates 4 bytes = 32 bits
DQ
Define Quadword
allocates 8 bytes = 64 bits
DT
Define Ten Bytes
allocates 10 bytes = 80 bits
Ví dụ:
choice DB 'y'
number DW 12345
neg_number DW -12345
big_number DQ 123456789
real_number1 DD 1.234
real_number2 DQ 123.456
Lưu ý:
Mỗi byte kí tự được lưu trữ dưới dạng giá trị ASCII trong base 16 (hexa)
Các giá trị thập phân sẽ tự động chuyển đổi 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ẽ sử dụng little endian.
Các số âm sẽ được chuyển đổi sang số bù 2
Short và long floating numbers sẽ sử dụng 32 or 64 bits.
Một chương trình ví dụ về khai báo các kiểu dữ liệu
section .text
global _start
_start:
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'
Kết quả:
y
Allocating Storage Space for Uninitialized Data
Tương tự với 5 kiểu khai báo biến trên thì ta cũng có 5 kiểu khai báo dự trữ dự trữ:
RESB
Reserve a Byte
RESW
Reserve a Word
RESD
Reserve a Doubleword
RESQ
Reserve a Quadword
REST
Reserve a Ten Bytes
my_var RESB 4 ; Dự trữ 4 byte cho biến my_var
my_array RESW 10 ; Dự trữ 10 từ (tức là 20 byte) cho mảng my_array
Tương đương với khai báo biến trong C : int number;
Multiple Definitions
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 biên dịch sẽ phân bổ nhiều bộ nhớ liền kề cho nhiều định nghĩa biến
Multiple Initializations
Chỉ định 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à marks
có kích thước là 9 được định nghĩa và khởi tạo thành 0 bằng cách sử dụng câu lệnh sau:
marks TIMES 9 DW 0
Chỉ định TIMES rất 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 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 '*'
Kết quả:
*********
Practice:
Hôm nay mình sẽ không cho bài tập vì các dạng bài khá giống với buổi trước. Bài tập mình sẽ cho khi học đến các instruction toán học: tức là add, sub, mul,... đó
Last updated