CHƯƠNG 6 : NGÔN NGỮ ASSEMBLY
1. Tổng quan
1.2 Biến và khai báo biến
Khi khai báo dữ liệu cho chương trình, người ta thường sử dụng toán tử DB. Nhưng trên thực tế, các toán tử khác cũng có thể được dùng đến để khai báo các dữ liệu có kiểu khác nhau.
DB – Define Byte : định nghĩa biến kiểu Byte DW – Define Word : định nghĩa biến kiểu Word
DD – Define Double Word : định nghĩa biến kiểu Double Word DT – Define Ten Byte : định nghĩa biến kiểu 10 Byte
EQU– Equal (bằng) : Khai báo một hằng, địa chỉ cổng xác định
a. Biến kiểu Byte
Biến kiểu byte sẽ chiếm 1 byte trong bộ nhớ. Hướng dẫn chương trình dịch để định nghĩa biến kiểu byte có dạng tổng quát như sau:
Ten_bien DB Gia_tri_khoi_tao Ví dụ: so1 DB 3Eh
Trong ví dụ trên so1 là một biến kiểu byte có giá trị khởi tạo là 3Eh, song đôi khi chúng ta không cần thiết phải khởi tạo giá trị cho biến, có thể sử dụng cách khai báo sau:
so1 DB ?
Cũng như các ngôn ngữ lập trình khác, một biến kí tự cũng được coi là một biến kiểu byte với mỗi kí tự được thể hiện bằng mã ASCII của chúng từ 0 – FFh
Giả sử muốn khai báo một biến kí tự và khởi tạo giá trị bằng “A”, ta có thể thực hiện một trong 2 cách khai báo sau:
Ch DB ‘A’ ;khởi tạo trực tiếp giá trị ‘A’
hoặc Ch DB 41h ;khởi tạo thông qua mã ASCII của ‘A’
b. Biến kiểu Word
Để khai báo một biến kiểu Word, ta có thể sử dụng cú pháp sau: Ten_bien DW Gia_tri_khoi_tao
Cũng giống như việc khai báo biến kiểu byte, Gia_tri_khoi_tao có thể là dấu hỏi (?) Ví dụ: w1 DB 3FB4h ;khai báo biến w1 với giá trị khởi tạo là 3FB4h
w2 DB ? ;khai báo biến w2 nhưng không khỏi tạo giá trị
82
Mảng là một danh sách (dãy) các phần tử có cùng một kiểu với các giá trị ( có thể ) khác nhau. Vì vậy, để khai báo một mảng ta có thể thực hiện theo cú pháp sau:
Ten_bien DB Danh_sach_gia_tri_khoi_tao;khai báo mảng các phần tử kiểu byte Ten_bien DW Danh_sach_gia_tri_khoi_tao;khai báo mảng các phần tử kiểu Word
Ví dụ1:
mang1 DB 30,55,73,88,83,90
Giả thiết, mang1 được nạp vào bộ nhớ tại địa chỉ offset 23E5h. Khi đó mảng này sẽ có các phần tử được khởi tạo và hình ảnh của chúng trong bộ nhớ như sau:
Tên phần tử Giá trị khởi tạo Địa chỉ bộ nhớ
Mang10 30 23E5h Mang11 55 23E6h Mang12 73 23E7h Mang13 88 23E8h Mang14 83 23E9h Mang15 90 23EAh Ví dụ 2: mang2 DW 2BA3h,2748h,9843h,1F3Bh
Cũng với giả thiết, mang2 được nạp vào bộ nhớ tại địa chỉ offset 23E5h. Khi đó mảng này sẽ có các phần tử được khởi tạo và hình ảnh của chúng trong bộ nhớ sẽ là:
Tên phần tử
Giá trị khởi tạo
Địa chỉ bộ nhớ
Mang20 2BA3h 23E5h
Mang22 2748h 23E7h
Mang24 9843h 23E9h
Mang26 1F3Bh 23EBh
Chúng ta có thể khởi tạo các giá trị liên tiếp giống nhau. Khi đó, ta cũng có thể sử dụng toán tử DUP.
Ví dụ 3:
mang3 DB 100 DUP(5Ch) ;mang3 là một mảng có 100 phần tử với các giá trị khởi tạo của các phần tử đều là 5Ch
Ví dụ 4:
mang4 DB 3,4,2,10 DUP(0) ;mang4 là một mảng có 13 phần tử, trong đó 3 phần tử đầu lần lượt có giá trị khởi tạo là 3,4,2 các phần tử còn lại (10phần tử) đều có giá trị khởi tạo bằng 0.
Với mảng 2 chiều việc định nghĩa chúng có thể thực hiện theo cú pháp sau: Ten_bien DB (DW) gia_tri_khoi_tao_hang_0 gia_tri_khoi_tao_hang_1 gia_tri_khoi_tao_hang_2 ……… gia_tri_khoi_tao_hang_n Ví dụ: Mang_2_chieu DB 10 DUP(0) 10 DUP(50)
83
10 DUP(100) 10 DUP(150)
Khai báo một mảng 2 chiều có 4 hàng 10 cột với giá trị khởi tạo của hàng 0 là 0, hàng 1 là 50, hàng 2 là 100, hàng 3 là 150
d. Biến chuỗi
Biến chuỗi hay xâu kí tự thực chất chỉ là một mảng 1 chiều các phần tử là các kí tự trong đó mỗi kí tự có thể được biểu diễn bằng một số là mã ASCII hoặc là kí tự nằm trong dấu “” hoặc ‘’. Vì vậy ta có thể khai báo bằng một trong các cách sau:
Xau1 DB ‘chao’
Xau2 DB ‘c’, ‘h’, ‘a’, ‘o’ Xau3 DB 43h,68h,61h,6Fh
e. khai báo hằng
ten bien EQU giatri (EQU: Equal) Ví dụ:
S01 EQU 10 ;biến S01 sẽ có giá trị là 10 và không thể thay đổi được giá trị của S01