Phần 3: Biến và mảng trong assembly

 -          Trình biên dịch không phân biệt chữ hoa chữ thường, vì vậy "VAR1" và "var1" tham chiếu đến cùng một biến. Ghi vAR1 như vậy nó cũng nhận nhé!

Biến (Variable)

Biến là một vị trí bộ nhớ. Đối với một lập trình viên, việc giữ một số giá trị trong một biến có tên "var1" tại địa chỉ 5A73: 235B sẽ dễ dàng hơn nhiều, đặc biệt là khi bạn có 10 biến trở lên.

Trong Emu8086 hỗ trợ 2 loại là: byte(8bit) và word(16bit).

 

Cú pháp để khai báo là:

DB: Define Byte

DWDefine Word

Tenbien db GiaTri             ;Khai báo kiểu byte (8bit)

Tenbien dw GiaTri            ; Khai báo kiểu word (16bit)

Tenbien : tự đặt nhưng phải đúng quy tắc đặt tên bắt đầu bằng chữ cái.

GiaTri: có thể là bất kỳ giá trị số nào trong bất kỳ hệ thống đánh số nào được hỗ trợ (thập lục phân, nhị phân hoặc thập phân) hoặc "?" biểu tượng cho các biến không được khởi tạo.

VD:

.model small

.stack 100h

.data

     var1 db 7                                     ;khoi tao bien 1

     var2 dw 1234h                          ;khoi tao bien 2

.code

MOV AL, var1                                  ;gan bien 1 cho AL

MOV BX, var2                                 ;gan bien 2 cho BX

mov ah, 4ch                                     ; dung chuong trinh

int 21h

ends

Ở đây chúng ta thấy: với kiểu khai báo DB thì gắn cho thanh ghi AL vì nó là 8bit. Biến 2 khai báo kiểu DW nên sẽ gán với thanh ghi 16bit là BX.

Sao chép đoạn code trên vào chương trình chạy:

Bấm run và chọn vars để xem kết quả.

Kết quả gán thành công:

VAR1 = 07h

VAR2 = 1234h


·        Khi trình biên dịch tạo ra mã máy, nó sẽ tự động thay thế tất cả các tên biến bằng các hiệu số của chúng. Theo mặc định, phân đoạn được tải trong thanh ghi DS (khi các tệp COM được tải, giá trị của thanh ghi DS được đặt thành cùng giá trị với thanh ghi CS – Phần .code).

·        Trong danh sách bộ nhớ hàng đầu tiên là offset, hàng thứ hai là hexadecimal value (giá trị thập lục phân), hàng thứ ba là decimal value (giá trị thập phân)và hàng cuối cùng là giá trị ký tự mã ASCII.

-         Địa chỉ offset của var1 là 0108h thì địa chỉ đầy đủ là 0B56:0108.

-         Địa chỉ offset của var1 là 0109h thì địa chỉ đầy đủ là 0B56:0109. Biến này là một WORD (2 byte). Giả sử byte thấp được lưu trữ ở địa chỉ thấp hơn, vì vậy 34h nằm trước 12h.

Arrays

Mảng có thể được coi là chuỗi các biến. Chuỗi văn bản là một ví dụ về mảng byte, mỗi ký tự được trình bày dưới dạng giá trị mã ASCII (0..255).

VD:

a DB 48h, 65h, 6ch, 6ch, 6Fh, 00h (chữ h là biểu hiện nó là mã hexa.).
b DB “HELLO”, 0

Chỉ số mảng đánh số bắt đầu bằng a[0],[1],[2],[3],[4],…,a[n]
Truy cập vào từng phần tử mảng:
MOV AL, a[3]
 
 
Bạn cũng có thể sử dụng bất kỳ thanh ghi chỉ số (index) trong bộ nhớ: BX, SI, DI, BP.
VD: 
MOV SI, 3
MOV AL, a[SI]
 

Nếu bạn cần khai báo một mảng lớn, bạn có thể sử dụng toán tử DUP.

Cú pháp:

number DUP value(s) )

-         number: Số lượng cần tạo (hằng số nào cũng được).

-         value: 

VD:

Cách 1:

DB 4 DUP(7)                     ; 7,7,7,7(4 số 7)

Khai báo kiểu khác:

DB 7,7,7,7

Cách 2:

b DB 3 DUP (3,4)

 Khai báo kiểu khác:

B DB 3,4,3,4,3,4                  ; 3,4 (gấp 3 lên)

·    -         Chúng ta có thể sử dụng DW thay vì DB nếu giữ các giá trị lớn hơn 255 hoặc nhỏ hơn -128.

Lưu ý: DW không thể được sử dụng để khai báo chuỗi.

Kết thúc

Copyright © 2021 Đoàn Quang Huy. All rights reserved.

Đăng nhận xét

0 Nhận xét