You are on page 1of 4

BÀI 2.

TRUY CẬP BỘ NHỚ

I. Mục tiêu:

 Hiểu được cách truy cập và sử dụng bộ nhớ trong emu8086.


 Thực hành sử dụng các lệnh để đọc và ghi dữ liệu vào bộ nhớ.
 Hiểu được cách sử dụng địa chỉ và kích thước của các biến trong bộ nhớ.

II. Chuẩn bị:

 Máy tính cài đặt phần mềm emu8086.


 Nắm vững kiến thức về lập trình ngôn ngữ assembly.

III. Nội dung thực hành:

Bước 1: Khai báo biến và địa chỉ trong bộ nhớ

Bước 2: Ghi giá trị vào bộ nhớ

 Sử dụng lệnh MOV để ghi giá trị vào thanh ghi hoặc biến

Bước 3: Đọc giá trị từ bộ nhớ

 Sử dụng lệnh MOV để đọc giá trị từ biến vào thanh ghi

Bước 4: Hiển thị giá trị lên màn hình

 Hàm DOS để xuất ký tự:


Hàm DOS có thể được sử dụng để in ký tự ra màn hình bằng cách gọi hàm int 21h với
AH=02h. Ví dụ:

mov dl, 'A' ; đặt ký tự 'A' vào thanh ghi DL


mov ah, 02h ; đặt mã hàm DOS 02h vào thanh ghi AH
int 21h ; gọi hàm DOS

 Hàm DOS để in chuỗi:

Hàm DOS có thể được sử dụng để in chuỗi ra màn hình bằng cách gọi hàm int 21h với
AH=09h. Ví dụ:

mov dx, offset message ; đặt địa chỉ của chuỗi vào thanh ghi DX
mov ah, 09h ; đặt mã hàm DOS 09h vào thanh ghi AH
int 21h ; gọi hàm DOS

Để sử dụng hàm trên cần khai báo biến message db 'Hello, world!', 0
Ví dụ 1: Viết chương trình in ra màn hình các ký tự ABCD

data segment

ends

stack segment
dw 128 dup(0)
ends

code segment
start:

mov ax, 0B800h


mov ds, ax

mov dl, 'A'


mov ah, 02h
int 21h

mov dl, 'B'


mov ah, 02h
int 21h

mov dl, 'C'


mov ah, 02h
int 21h

mov dl, 'D'


mov ah, 02h
int 21h

mov ah, 4ch


int 21h

mov ax, 4c00h


int 21h

ends
end start

Chương trình trên có cấu trúc cơ bản của một chương trình 16-bit trên Emu8086. Sau đây
là giải thích từng phần của chương trình:
data segment
ends
Phần này là khai báo của phân đoạn dữ liệu (data segment) và sẽ được sử dụng để khai
báo các biến dữ liệu cho chương trình. Tuy nhiên, trong trường hợp này, chương trình
không sử dụng bất kỳ biến nào, vì vậy nó chỉ có một phần khai báo rỗng.
stack segment
dw 128 dup(0)
ends
Phần này là khai báo của phân đoạn stack (stack segment), nơi chương trình sẽ lưu trữ
các giá trị stack. Trong trường hợp này, đoạn mã đang khai báo một stack có độ dài là
128 từ, mỗi từ có độ dài 2 byte.
code segment
start:
Phần này là khai báo của phân đoạn mã (code segment), nơi chương trình sẽ chứa mã
lệnh. Tên "start" ở đây là nhãn cho địa chỉ bắt đầu của chương trình.
mov ax, 0B800h
mov ds, ax
Đây là mã lệnh để thiết lập thanh ghi DS để trỏ đến đầu vùng nhớ video (0B800h), nơi
chương trình sẽ in các ký tự ra màn hình.
mov dl, 'A'
mov ah, 02h
int 21h
Đây là mã lệnh để in ký tự 'A' ra màn hình bằng cách sử dụng hàm DOS với mã số 02h.
Tương tự, các mã lệnh tiếp theo sẽ in ra các ký tự 'B', 'C', và 'D' lên màn hình.
mov ah, 4ch
int 21h
Đây là mã lệnh để kết thúc chương trình bằng cách sử dụng hàm DOS với mã số 4Ch.
mov ax, 4c00h
int 21h
Đây là mã lệnh dành cho trình kết thúc chương trình, nó trả về giá trị 00 cho hàm main
của chương trình, sau đó gọi trình ngắt 21h để thoát khỏi chương trình.

Ví dụ 2: Viết chương trình đọc và ghi giá trị vào bộ nhớ

#MAKE_COM#
ORG 100h
MOV AX, 0B800h
MOV DS, AX
MOV CL, 'A'
MOV CH, 01011111b
MOV BX, 15Eh
MOV [BX], CX
RET

Đoạn lệnh này là mã lệnh Assembly và thực hiện một số thao tác trên bộ vi xử lý. Dưới
đây là giải thích từng lệnh:

 "#MAKE_COM#": Lệnh này không phải là một lệnh xử lý, mà chỉ là một chú
thích. Nó cho biết rằng chương trình đang được biên dịch để tạo ra một file COM
(chương trình thực thi trên DOS hoặc Windows).
 "ORG 100h": Lệnh này yêu cầu bắt buộc cho một chương trình COM, nó chỉ định
vị trí bắt đầu của chương trình ở địa chỉ 100h.
 "MOV AX, 0B800h": Lệnh này di chuyển giá trị hexadecimal B800h vào thanh
ghi AX. Đây là địa chỉ của bộ nhớ đệm màn hình (video buffer) trong bộ nhớ
VGA.
 "MOV DS, AX": Lệnh này sao chép giá trị của thanh ghi AX vào thanh ghi DS.
Điều này đặt DS trỏ đến địa chỉ B800h, cho phép truy cập vào bộ nhớ đệm màn
hình.
 "MOV CL, 'A'": Lệnh này di chuyển mã ASCII của ký tự 'A' (là 41h) vào thanh
ghi CL.
 "MOV CH, 01011111b": Lệnh này di chuyển giá trị nhị phân 01011111 vào thanh
ghi CH.
 "MOV BX, 15Eh": Lệnh này di chuyển giá trị hexadecimal 15Eh vào thanh ghi
BX.
 "MOV [BX], CX": Lệnh này sao chép nội dung của thanh ghi CX vào vị trí bộ
nhớ được chỉ định bởi giá trị của thanh ghi BX. Do BX có giá trị 15Eh và DS trỏ
đến địa chỉ B800h, vì vậy nội dung của CX được sao chép vào địa chỉ bộ nhớ
B800:015E. Nó làm cho ký tự 'A' hiển thị trên màn hình ở hàng thứ nhất và cột thứ
30.
 "RET": Lệnh này trả về cho hệ điều hành.

Tổng thể, đoạn lệnh này sẽ hiển thị ký tự 'A' trên màn hình ở hàng đầu tiên và cột thứ 30
khi được thực thi.

IV. Kết luận:

 Sau khi thực hành, SV đã nắm vững cách truy cập và sử dụng bộ nhớ trong
emu8086.
 Hiểu được cách sử dụng địa chỉ và kích thước của các biến trong bộ nhớ.
 Nâng cao kỹ năng lập trình ngôn ngữ assembly.

You might also like