Tài liệu thực hành Vi xử lý
BÀI 1: PHẦN MỀM MÔ PHỎNG 8086
MICROPROCESSOR EMULATOR (EMU8086)
MỤC ĐÍCH
Giúp sinh viên khảo sát các vấn đề sau:
Sử dụng phần mềm Emu8086 để mô phỏng hoạt động của vi xử lý 8086.
THIẾT BỊ SỬ DỤNG
Máy vi tính.
Phần mềm Emu8086
1. Giới thiệu.
Phần mềm Emu8086 là phần mềm cho phép mô phỏng hoạt động của vi
xử lý 8086 bao gồm các câu lệnh cơ bản của 8086, xử lý ngắt mềm, giao tiếp với
thiết bị ngoại vi, …
Khởi động chương trình
Start > All Program > emu8086 > emu8086
Vũ Đức Hòa
Trang 1
Tài liệu thực hành Vi xử lý
Cửa sổ chương trình sau khi khởi động:
Thanh công cụ chuẩn
Vùng không gian soạn thảo
chương trình
Sử dụng thanh công cụ chuẩn:
New: tạo file mới
Open: mở file có
sẵn
Save: lưu trữ file
Compile: biên
dịch file
Emulate: biên dịch
và thực hiện mô
phỏng
Các thao tác trên thanh công cụ chuẩn cũng có thể thực hiện thông qua
menu File và menu Emulator.
Tạo và thực thi chương trình:
-
Nhấn New trên thanh công cụ sẽ xuất hiện cửa sổ chọn loại file:
Vũ Đức Hòa
Trang 2
Tài liệu thực hành Vi xử lý
Nhấn Cancel để bỏ qua, cửa sổ soạn thảo của chương trình sẽ xuất hiện.
-
Soạn chương trình hợp ngữ và nhấn vào nút Emulate để biên dịch và
mô phỏng chương trình.
Sau khi biên dịch thành công (không có lỗi trong chương trình), Emu8086
sẽ mở thêm 2 cửa sổ: cửa sổ chương trình gốc và cửa sổ mô phỏng.
Chương trình gốc:
Vũ Đức Hòa
Trang 3
Tài liệu thực hành Vi xử lý
Nhấn Run để
thực thi
Cửa sổ mô phỏng:
-
Nếu chương trình có lỗi, cửa sổ thông báo lỗi sẽ xuất hiện:
Dòng lỗi
Vũ Đức Hòa
Lỗi tại dòng 11
Trang 4
Tài liệu thực hành Vi xử lý
Nhấn Close để quay lại cửa sổ soạn thảo.
Cấu trúc chương trình 8086:
.model small
.stack 100h
.data
;Khai bao du lieu
.code
main proc
mov ax,@data
mov ds,ax
;Chuong trinh hop ngu
mov ah,4Ch
int 21h
main endp
;----- Cac chuong trinh con --Ctc1 proc
; Ma lenh cua chuong trinh con
ret
Ctc1 endp
;----------End
2. Cơ sở lý thuyết
2.1.
Ngắt 21h
Hàm 01h: nhập một ký tự từ bàn phím và hiện ký tự nhập ra màn hình. Nếu
không có ký tự nhập, hàm 01h sẽ đợi cho đến khi nhập.
- Gọi: AH = 01h
- Trả về: AL chứa mã ASCII của ký tự nhập
MOV
AH,01h
INT
21h
; AL chứa mã ASCII của ký tự nhập
Hàm 02h: xuất một ký tự trong thanh ghi DL ra màn hình tại vị trí con trỏ
hiện hành
- Gọi AH = 02h, DL = mã ASCII của ký tự
- Trả về: không có
MOV
AH,02h
MOV
DL,'A'
Vũ Đức Hòa
Trang 5
Tài liệu thực hành Vi xử lý
INT
21h
Hàm 08h: giống hàm 01h nhưng không hiển thị ký tự ra màn hình
Hàm 09h: xuất một chuỗi ký tự ra màn hình tại vị trí con trỏ hiện hành, địa
chỉ chuỗi được chứa trong DS:DX và phải được kết thúc bằng ký tự $
- Gọi AH = 09h, DS:DX = địa chỉ chuỗi
- Trả về: không có
.DATA
Msg
…
MOV
LEA
INT
DB
'Hello$'
AH,09h
DX,Msg
21h
Hàm 0Ah: nhập một chuỗi ký tự từ bàn phím (tối đa 255 ký tự), dùng phím
ENTER kết thúc chuỗi
- Gọi AH = 0Ah, DS:DX = địa chỉ lưu chuỗi
- Trả về: không có
Chuỗi phải có dạng sau:
-
Byte 0: Số byte tối đa cần đọc (kể cả ký tự Enter)
Byte 1: số byte đã đọc
Byte 2: lưu các ký tự đọc
.DATA
Msg
DB
DB
…
MOV
LEA
INT
DB
?
101
101
; Đọc tối đa 100 ký tự
DUP(?)
AH,0Ah
DX,Msg
21h
Hàm 0Bh: kiểm tra phím nhấn trên bàn phím
Gọi: AH = 0Bh
Trả về: AL = 0FFh nếu có nhấn phím, AL = 0 nếu không nhấn phím
Hàm 4Ch: kết thúc chương trình
MOV
AH,4Ch
INT
21h
2.2.
Ngắt 10h
Hàm 02h: Gọi AH = 02h, DH = dòng, DL = cột
MOV
AH,02h
MOV
DX,0F15h
INT
10h
Vũ Đức Hòa
Trang 6
Tài liệu thực hành Vi xử lý
3. Tiến trình thực hiện
3.1.
-
Các lệnh cơ bản
Bài 1.1: Thực hiện chương trình sau (cộng 49h với 8Ah):
.model small
.stack 100h
.data
msg db 'Hello$'
.code
main proc
mov ax,@data
mov ds,ax
mov al,49h
add al,8Ah
mov ah,4Ch
int 21h
main endp
;----------End
-
Nhấn vào nút Emulate để thực hiện mô phỏng.
-
Tại cửa sổ mô phỏng, chọn menu View > Flags để hiển thị nội dung
các cờ.
Vũ Đức Hòa
Trang 7
Tài liệu thực hành Vi xử lý
Cửa sổ flags cho phép xem nội dung của các cờ:
-
Nhấn nút Run thực thi chương trình và quan sát nội dung các cờ. Giải
thích.
-
Bài 1.2: Thực hiện chương trình cộng 2 số và kiểm tra nội dung các
cờ: CF, ZF, SF, OF, PF, AF. Từ đó rút ra kết luận về mục đích của các
cờ này.
-
0FFh + 01h
0FFh + 10h
40h + 55h
22h + 8Fh
Vũ Đức Hòa
Trang 8
Tài liệu thực hành Vi xử lý
-
99h + 7Ch
-
Bài 1.3: Thực hiện lệnh nhân giữa 15h và 41h, 154h và 289Ah.
-
Bài 1.4: Thực hiện lệnh chia giữa 5623h và 14h, 3219154h và 9Ah.
-
Bài 1.5: Thực hiện lệnh dịch trái 1 bit, 2 bit, 3 bit giá trị 25h.
-
Bài 1.6: Thực hiện lệnh quay trái 1 bit, 2 bit, 3 bit giá trị 25h.
-
Bài 1.7: Thực hiện lệnh quay trái kết hợp với cờ carry 1 bit, 2 bit, 3 bit
giá trị 25h.
-
Bài 1.8: Thực hiện lệnh dịch phải 1 bit, 2 bit, 3 bit giá trị 25h.
-
Bài 1.9: Thực hiện lệnh quay phải 1 bit, 2 bit, 3 bit giá trị 25h.
-
Bài 1.10: Thực hiện lệnh quay phải kết hợp với cờ carry 1 bit, 2 bit, 3
bit giá trị 25h.
-
Bài 1.11: Sử dụng lệnh IN để nhập dữ liệu và lệnh OUT để xuất dữ
liệu ra thiết bị ngoại vi có địa chỉ 110. Chú ý thêm vào chuỗi
#start=simple.exe# ở đầu chương trình để kiểm tra kết quả.
3.2. Sử dụng ngắt 21h và ngắt 10h
Bài 1.12: Dùng hàm 09h xuất chuỗi ra màn hình:
.model small
.stack 100h
.data
msg db 'Hello$'
.code
main proc
mov ax,@data
mov ds,ax
mov ah,09h
; Xuất chuỗi ra màn hình
lea dx,msg
int 21h
exit:
mov ah,4Ch
int 21h
main endp
Vũ Đức Hòa
Trang 9
Tài liệu thực hành Vi xử lý
;----------End
Bài 1.13: Bỏ dấu $ ở cuối chuỗi Hello, thực hiện lại chương trình và nhận
xét kết quả.
Bài 1.14: Thực hiện giống như bài 1.12 nhưng thực hiện liên tục cho đến
khi nhấn một phím bất kỳ trên bàn phím thì dừng. Gợi ý: dùng hàm 0Bh
để kiểm tra phím nhấn, nếu có nhấn phím thì kết thúc chương trình.
.model small
.stack 100h
.data
msg db 'Hello$'
.code
main proc
mov ax,@data
mov ds,ax
mov ah,09h
; Xuất chuỗi ra màn hình
lea dx,msg
int 21h
mov ah,0Bh
int 21h
cmp al,00h
jne exit
; Xuất chuỗi
exit:
mov ah,4Ch
int 21h
Vũ Đức Hòa
Trang 10
Tài liệu thực hành Vi xử lý
…
end
Bài 1.15: Xuất chuỗi ‘Hello’ ra màn hình tại hàng 10, cột 10. Gợi ý: dùng
hàm 02h của ngắt 10h chuyển toạ độ trước khi xuất chuỗi.
Bài 1.16: Nhập một ký tự từ bàn phím và xuất ký tự vừa nhập ra màn hình
tại hàng 11, cột 10.
.model small
.stack 100h
.data
msg db 'Hello$'
.code
main proc
mov ax,@data
mov ds,ax
mov ah,08h
; Nhập ký tự từ bàn phím
int 21h
Vũ Đức Hòa
Trang 11
Tài liệu thực hành Vi xử lý
push ax
; Lưu ký tự vừa nhập
mov ah,02h
; Chuyển toạ độ con trỏ
mov dx,0B0Ah
int 10h
pop ax
mov dl,al
; Xuất ký tự
mov ah,02h
int 21h
mov ah,4Ch
int 21h
main endp
;----------End
Bài 1.17: Nhập một ký tự từ bàn phím và xuất ra màn hình ở dạng chữ
hoa. Gợi ý: thêm một đoạn chương trình kiểm tra ký tự nhập, nếu là ký tự
chữ thường thì chuyển thành chữ hoa rồi xuất ta màn hình.
cmp al,'a'
; Nếu < ‘a’
jb next
; hay > ‘z’ thì không phải là
cmp al,'z'
; chữ thường
ja next
sub al,20h
; Chuyển từ chữ thường -> hoa
next:
Bài 1.18: Nhập liên tục các ký tự, xuất ra màn hình ở dạng chữ hoa và
kết thúc chương trình khi nhấn phím ESC. Gợi ý: sau khi nhập thì
kiểm tra ký tự vừa nhập, nếu là ESC thì thoát (mã ASCII của phím
ESC là 27 hay 1Bh).
cmp al,27
je exit
Vũ Đức Hòa
Trang 12
Tài liệu thực hành Vi xử lý
…
exit:
mov ah,4Ch
int 21h
Bài 1.19: Dùng hàm 02h của ngắt 21h để xuất chuỗi:
.model small
.stack 100h
.data
msg db 'Hello$'
.code
main proc
mov ax,data
mov ds,ax
mov si,0
lap:
mov dl,msg[si]
cmp dl,'$'
je exit
mov ah,02h
int 21h
inc si
jmp lap
exit:
mov ah,4Ch
int 21h
main endp
end main
Vũ Đức Hòa
Trang 13
Tài liệu thực hành Vi xử lý
Bài 1.20: Dùng hàm 02h của ngắt 21h để xuất chuỗi ‘Hello’ theo chiều
thẳng đứng bắt đầu tại hàng 1, cột 10. Gợi ý: dùng hàm 02h của ngắt
10h để di chuyển toạ độ con trỏ sau khi xuất một ký tự.
H
e
l
l
o
Bài 1.21: Xuất chuỗi ‘Hello’ theo đường chéo như hình vẽ bắt đầu tại
hàng 1, cột 1.
H
e
l
l
o
Bài 1.22: Xuất chuỗi ‘Hello’ theo đường chéo như hình vẽ bắt đầu tại
hàng 1, cột 40.
H
e
l
l
o
Bài 1.23: Di chuyển ký tự ‘A’ theo chiều ngang từ trái sang phải bắt
đầu tại hàng 1, cột 1 và kết thúc tại hàng 1, cột 40.
.model small
.stack 100h
.data
.code
main proc
Vũ Đức Hòa
Trang 14
Tài liệu thực hành Vi xử lý
mov ax,data
mov ds,ax
mov dh,1
mov dl,1
; Hàng 1, cột 1
mov ah,02h
; Gọi hàm 02h của ngắt 10h
int 10h
; để chuyển toạ độ
lap:
push dx
mov dl,'A'
; Gọi hàm 02h của ngắt 21h
mov ah,02h
; để xuất ký tự
int 21h
pop dx
call delay
; Tạo thời gian trễ
mov ah,02h
int 10h
push dx
mov dl,' '
; Xuất ký tự khoảng trắng
mov ah,02h
; để xoá ký tự cũ
int 21h
pop dx
inc dl
; Chuyển sang cột kế
cmp dl,41
; Đến cột 41 thì dừng
jne lap
exit:
mov ah,4Ch
int 21h
Vũ Đức Hòa
Trang 15
Tài liệu thực hành Vi xử lý
main endp
delay proc
push cx
mov cx,0fh
loop $
pop cx
ret
delay endp
end main
Bài 1.24: Xoá đoạn chương trình in đậm trong bài 1.23, thực thi
chương trình và kiểm tra kết quả.
Bài 1.25: Thực hiện chương trình 1.23 nhưng theo chiều thẳng đứng từ
trên xuống bắt đầu tại hàng 1, cột 1 và kết thúc tại hàng 15, cột 1.
Bài 1.26: Thực hiện chương trình 1.23 nhưng theo chiều ngang từ phải
sang trái bắt đầu tại hàng 1, cột 40 và kết thúc tại hàng 1, cột 1.
Bài 1.27: Thực hiện chương trình 1.23 nhưng theo chiều thẳng đứng từ
dưới lên bắt đầu tại hàng 15, cột 1 và kết thúc tại hàng 15, cột 1.
Bài 1.28: Thực hiện chương trình 1.23 nhưng theo đường chéo như
hình vẽ.
Hàng 1, cột 1
Hàng 15, cột 15
Bài 1.29: Thực hiện chương trình 1.23 nhưng theo đường chéo như
hình vẽ.
Hàng 1, cột 1
Hàng 15, cột 15
Bài 1.30: Thực hiện chương trình 1.23 nhưng theo đường chéo như
hình vẽ.
Hàng 1, cột 15
Hàng 15, cột 1
Vũ Đức Hòa
Trang 16
Tài liệu thực hành Vi xử lý
Bài 1.31: Thực hiện chương trình 1.23 nhưng theo đường chéo như
hình vẽ.
Hàng 1, cột 15
Hàng 15, cột 1
Bài 1.32: Thực hiện chương trình 1.23 nhưng di chuyển ký tự như hình
vẽ, bắt dầu tại hàng 1, cột 1.
Hàng 1, cột 1
Hàng 1, cột 10
Hàng 10, cột 1
Hàng 10, cột 10
Hàng 20, cột 1
Bài 1.33: Nhập một chuỗi từ bàn phím và xuất chuỗi ra màn hình bằng
cách dùng hàm 02h của ngắt 21h.
.model small
.stack 10h
.data
msg db 101
db ?
; Chuỗi có tối đa 100 ký tự
; Số ký tự thực tế
db 101 dup(?)
.code
main proc
mov ax,@data
mov ds,ax
mov ah,0Ah
; Hàm 0Ah nhập chuỗi
lea dx,msg
; DX chứa địa chỉ chuỗi
int 21h
Vũ Đức Hòa
Trang 17
Tài liệu thực hành Vi xử lý
mov si,2
; Vị trí lưu ký tự nhập
lap:
mov dl,msg[si]
cmp dl,13
; Phím Enter thì kết thúc
je exit
mov ah,02h
int 21h
inc si
jmp lap
exit:
mov ah,4Ch
int 21h
main endp
end main
Bài 1.34: Thay giá trị ban đầu của SI tại dòng in đậm trong bài 1.33
bằng giá trị 0, thực thi chương trình và quan sát kết quả.
Bài 1.35: Nhập một chuỗi từ bàn phím và xuất chuỗi ra màn hình bằng
cách dùng hàm 09h của ngắt 21h.
Lưu ý là hàm 09h dùng để xuất chuỗi trong đó chuỗi bắt buộc phải kết
thúc bằng ký tự $ nên phải thêm ký tự này vào cuối chuỗi trước khi xuất.
.model small
.stack 10h
.data
msg db 101
db ?
db 101 dup(?)
.code
main proc
mov ax,@data
mov ds,ax
Vũ Đức Hòa
Trang 18
Tài liệu thực hành Vi xử lý
mov ah,0Ah
lea dx,msg
int 21h
mov si,1
; Đọc số lượng ký tự nhập
mov al,msg[si]
mov ah,0
mov si,ax
; Kết quả chứa vào SI
mov al,'$'
; Thêm ‘$’ vào cuối chuỗi
mov msg[si],al
mov ah,09h
; Gọi hàm 09h xuất chuỗi
lea dx,msg
add dx,2
int 21h
exit:
mov ah,4Ch
int 21h
main endp
end main
Bài 1.36: Bỏ dòng in đậm trong bài 1.35, thực thi chương trình và quan
sát kết quả.
Bài 1.37: Thực hiện bài 1.32 nhưng thay ký tự ‘A’ bằng chuỗi ‘LAP
TRINH HOP NGU’. Gợi ý: Thay thế hàm 02h trong bài 1.32 bằng
hàm 09h (thêm ký tự $ vào cuối chuỗi).
Vũ Đức Hòa
Trang 19
- Xem thêm -