DIV nguồn (Unsigned Divide)
3.2.3. Biến và hằng
Một biến bất kỳ được sử dụng trong chương trình hợp ngữ phải được định nghĩa, chương trình dịch sẽ gán cho biến đó một địa chỉ xác định trong bộ nhớ.
Biến đơn
Một biến đơn trong chương trình hợp ngữ được định nghĩa theo mẫu sau:
Tên_biến Kiểu Giá trị khởi tạo
• Tên: do người sử dụng tự đặt theo quy tắc đặt tên.
• Kiểu: là kích thước (phạm vi) biểu diễn của biến. Có các kiểu sau:
o DB (Define Byte): Kiểu byte (1 byte).
o DD (Define Double Word): Kiểu double word (4 byte).
o DF (Define Farword): Kiểu farword (6 byte), chỉ dùng với bộ vi xử lý 80386 trở lên.
o DQ (Define Quadword): Kiểu Quadword (8 byte).
o DT (Define Ten byte): Kiểu Ten byte (10 byte).
Trong một biến có kích tước lớn hơn 1 byte thì byte cao ở địa chỉ cao, byte thấp ở địa chỉ thấp (theo quy ước Big-endian của Intel).
Ví dụ:
Ab db 4 ; Định nghĩa một biến có tên là Ab, kích thước 1 byte và ; được khởi tạo giá trị bằng 4.
Ab1 db ? ; Định nghĩa một biến có tên là Ab1, kích thước 1 byte và ; được chưa được khởi tạo giá trị.
Ab2 dw 100h ; Định nghĩa một biến có tên là Ab2, kích thước 2 byte và ; được được khởi tạo giá trị bằng 100h = 256.
Ab3 dw ? ; Định nghĩa một biến có tên là Ab3, kích thước 2 byte và ; được chưa được khởi tạo giá trị.
Biến mảng
Một biến mảng trong chương trình hợp ngữ được định nghĩa theo mẫu sau:
Tên_biến Kiểu Các giá trị khởi tạo
• Tên: do người sử dụng tự đặt theo quy tắc đặt tên.
• Kiểu: là kích thước (phạm vi) biểu diễn của biến như đã biết.
Biến mảng là biến hình thành từ một dãy liên tiếp các phần tử cùng kiêu. Khi định nghĩa biến mảng ta gán tên cho một dãy liên tiếp các phần tử có cùng độ dài (kích thước) trong bộ nhớ cùng với các giá trị ban đầu tương ứng.
Ví dụ:
Ar db 1, 3, 2, 4
Định nghĩa một biến có tên là Ar, gồm 4 phần tử, mỗi phần tử có kích thước 1 byte (gồm 4 byte được dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng với Ar để chứa các giá trị khởi đầu là: 1, 2, 3 và 4). Phần tử đầu tiên của mảng có địa chỉ trùng với địa chỉ của Ar và có giá trị là 1, phần tử thứ 2 có địa chỉ là Ar+1 và có giá trị là 2, …
Ta có thể dùng tốn tử DUP để khởi đầu giá trị các phần tử của mảng với cùng một giá trị.
Ví dụ:
Ar1 dw 100DUP(5)
Định nghĩa một biến có tên là Ar1, gồm 100 phần tử, mỗi phần tử có kích thước 2 byte (gồm 200 byte được dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng với Ar1 để chứa với cùng một giá trị khởi đầu cho mỗi 2 byte (word) là 5). Phần tử đầu tiên của mảng có địa chỉ trùng với địa chỉ của Ar1, các phần tử tiếp theo có địa chỉ Ar1+2, Ar1+4, Ar1+6, …
Ar2 dd 20DUP(?)
Định nghĩa một biến có tên là Ar2, gồm 20 phần tử, mỗi phần tử có kích thước 4 byte (gồm 80 byte được dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng với Ar2 và chưa được khởi
đầu giá trị). Phần tử đầu tiên của mảng có địa chỉ trùng với địa chỉ của Ar, các phần tử tiếp theo có địa chỉ Ar2+4, Ar2+8, Ar2+12, …
Đặc biệt ta có thể dùng tốn tử DUP lồng nhau để khởi đầu giá trị các phần tử của mảng.
Ví dụ:
Ar3 db 2, 2, 2DUP(1, 3DUP(5), 4)
Định nghĩa một biến có tên là Ar3, gồm 12 phần tử, mỗi phần tử có kích thước 1 byte (gồm 12 byte được dành chỗ cho nó trong bộ nhớ từ địa chỉ ứng với Ar3 để chứa các giá trị khởi đầu cho mỗi byte). Phần tử đầu tiên của mảng có địa chỉ trùng với địa chỉ của Ar3, các phần tử tiếp theo có địa chỉ Ar3+1, Ar3+2, …
Dãy thứ tự giá trị các phần tử là: 2, 2, 1, 5, 5, 5, 4, 1, 5, 5, 5, 4. Biến xâu
Biến kiểu xâu ký tự là trường hợp dặc biệt của biến mảng mà các phần tử của mảng là ký tự. Một xâu ký tự có thể được định nghĩa bằng các ký tự, xâu ký tự hoặc bằng mã ASCII của các ký tự.
Chúng ta có thể định nghĩa biến xâu ký tự theo các dịng ví dụ sau, chúng là tương đương nhau: Ví dụ: Str1 db 'Co non' Str2 db 'C', 'o', ' ', 'n', 'o', 'n' Str3 db 'C', 'o', ' ', 'non' Str4 db 43h, 6fh, 32h, 6eh, 6fh, 6eh Str5 db 43h, 'o', 32h, 'n', 6fh, 6eh Hằng
Trong chương trình hợp ngữ, các giá trị khơng đổi thường được gán tên làm cho chương trình rõ ràng, dễ đọc hơn - gọi là các hằng. Hằng trong chương trình có thể là kiểu số hoặc kiểu ký tự. Việc gán tên cho hằng được thực hiện nhờ lệnh giả EQU (Equate) theo mẫu sau:
Tên_hằng Equ Giá trị khởi tạo
Ví dụ:
Cr Equ 0dh ; Carriage return Lf Equ 0ah ; Line feed
Pa Equ 3f8h
Clause Equ 'Co non xanh tan chan troi' Str db Clause,'$'
Str1 db Clause, Cr, Lf, '$'