Đếm số lượng chữ “B” trong xâu: Sau khi so sánh với “B” xong thì thông qua biến dem mà dữ liệu số lượng chữ “B” có trong xâu được lưu vào thanh ghi AL và dùng lệnh DIV để làm tròn số
Trang 1VI XỬ LÝ – VI ĐIỀU KHIỂN
MỤC LỤC
VI XỬ LÝ – VI ĐIỀU KHIỂN 1
MỤC LỤC 1
5 NỘI DUNG 1
Bước 1 Mục đích, yêu cầu của bài tập 1
Bước 3: Sơ đồ thuật toán 2
Bước 4 Các câu lệnh dùng trong bài 2
Bước 5: Trình bày các chương trình con thực hiện các chức năng chính: 5
Bài làm chính: 5
Bước 6: Trình bày các đoạn mã lệnh trong bài và ý nghĩa dùng chúng 9
5 NỘI DUNG
Tên đề tài: Viết chương trình nhập một xâu ký tự, độ dài 10 ký tự, In ra màn hình số lần xuất hiện ký tự ‘B’ trong xâu
Bước 1 Mục đích, yêu cầu của bài tập.
Mục đích:
Nhập một xâu ký tự từ bàn phím
In ra màn hình số lần xuất hiện ký tự “B” trong xâu
Yêu cầu:
Viết chương trình nhập một xâu, in ra màn hình số lần xuất hiện ký tự “B” trong xâu
Bước 2 Cách tiếp cận đề tài
Nhập một xâu ký tự từ bàn phím: thông qua việc dùng thanh ghi AL để nhập tạm thời các ký tự vào đó và từ đó chúng được chuyển vào thanh ghi SI Và từ
Trang 2đây các ký tự sẽ được hiển thị ra màn hình và sau đó là để kiểm tra (so sánh) với ký tự
“B” Việc nhập chỉ kết thúc khi gõ phím Enter trên bàn phím
So sánh các ký tự trong xâu với “B”: Dùng các vòng lặp để so sánh tuần
tự các ký tự trong xâu ở SI với mã Hex của ký tự “a” là 42h
Đếm số lượng chữ “B” trong xâu: Sau khi so sánh với “B” xong thì
thông qua biến dem mà dữ liệu số lượng chữ “B” có trong xâu được lưu vào thanh ghi
AL và dùng lệnh DIV để làm tròn số đó là số nguyên, và sau đó hiển thị ra màn hình
số đó
Hiện thị ra màn hình số lượng chữ “B” trong xâu bằng chữ số: Sử dụng lệnh ngắt để in ra màn hình
Bước 3: Sơ đồ thuật toán.
Bước 4 Các câu lệnh dùng trong bài
Dạng lệnh: MOV Đích, Nguồn
Mô tả: Đích Nguồn
Ý nghĩa: di chuyển dữ liệu từ toán hạng nguồn đến toán hạng đích
Trang 3Toán hạng nguồn và đích có thể tìm được theo các chế đọc địa chỉ khác nhau, nhưng phải có cùng độ dài và không được phép đồng thời là hai ô nhớ hoặc hai thanh ghi đoạn
Các cờ bị thay đổi: không
Ví dụ: MOV AL,AH ;ALAH
MOV CX,50 ;CX50
MOV DL,[SI] ;DL{DL:SI}
Dạng lệnh: LEA Đích,Nguồn
Trong đó Đích là một trong các thanh ghi: BX, CX, DX, PB, SI, DI
Nguồn là tên biến trong đoạn DS được chỉ rõ trong lệnh hoặc ô nhớ cụ thể
Đíchđịa chỉ lệch của nguồn
Đíchđịa chỉ hiệu dụng của nguồn
Đây là lệnh tinhd địa chỉ lệch của biến hoặc địa chỉ của ô nhớ chọn làm Nguồn nạp vào thanh ghi đã chọn
Các cờ bị thay đổi: không
Ví dụ:
LEA DX, Label ;nap dia chi cua lech Label vao DX
LEA CX, [BX][DI] ;nap vao CX dia chi hieu dung do
;BX va DI chi ra EA=BX+DI
Dạng lệnh: INT N (N= 0…FFH)
Các thao tác của 8086 khi chạy lệnh INT
Tạo địa chỉ mới của Stack, cất thanh ghi cờ vào Stack: SPSP-2, {FR}SP Cấm các ngắt khác nhau tác động vào vi xử lý, cho vi xử lý chay ở chế độ từng lệnh: IF0, TF0
Tao địa chỉ mới của Stack, cất địa chỉ đaonj của địa chỉ trở về vào Stack: SPSP-2, SPCS
Tạo địa chỉ mới của Stack, cất địa chỉ lệch của địa chỉ trở về vào Stack : SPSP-2, SPIP
Vi xử lý lấy lệnh tại địa chỉ mới, đại chỉ con trỏ ngắt được tinhd toán như sau: {Nx4}IP, {Nx4+2}CS
Ví dụ: với N=8 thì CS{0022H} và {0020H}
Dạng lệnh : CMP Đích, Nguồn
CMP trừ toán hạng đích cho toán hạng nguồn, chúng có thể là các byte hoặc các
từ, nhưng không lưu trữ kết quả Các toán hạng không bị thay đổi Kết quả của lệnh này dùng để cập nhật các cờ và có thể được dùng để làm điều kiện cho các lệnh nhảy
có điều kiện tiếp theo
Các cờ bị thay đổi: AF, CF, OF, PF, SF, ZF
INC (tăng toán hạng lên 1)
Dạng lệnh: INC Đích
Mô tả: Đích Đích + 1
Lệnh này tăng Đích lên 1
Các cờ bị thay đổi: AF, OF, PF, SF, ZF
Trang 4Ví dụ: INC AL
INC BX
JMP (lệnh nhảy không điều kiện)
JMP trao quyền điều khiển cho vùng mục tiêu một cách không điều kiện Lệnh phân biệt nhảy gầnn nhảy xa
Dạng lênh: sau đây là nhưng cách viết lệnh không điều kiện:
JMP NHAN
Lệnh mới này bắt đầu địa chỉ với NHAN Chương trình sẽ căn cú vào khoảng dịch giữa NHAN và lệnh nhảy để xác định xem nó là:
+ Nhảy ngắn : trong trường hợp này NHAN nằm cách xa (dịch đi một khoảng) -128…127 byte so với lệnh tiếp theo sau lệnh JMP Chương trình sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển Do đó:
IPIP+dịch chuyển
Đây là lệnh nhảy trực tiếp vì dịch chuyển để trực tiếp trong mã lệnh
Để định hướng cho chương trình dịch làm việc nên viết lệnh dưới dạng:
JMP SHORT NHAN
+ Nhảy gần: : trong trường hợp này NHAN nằm cách xa (dịch đi một khoảng) -32768…+32768 byte so với lệnh tiếp theo JMP Chương trình sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển Do đó
IPIP+dịch chuyển
Đây là lệnh nhảy trực tiếp vì dịch chuyển để trực tiếp trong mã lệnh
Để định hướng cho chương trình dịch làm việc nên viết lệnh dưới dạng:
JMP NEAR NHAN
+ Nhảy xa: : trong trường hợp này NHAN nằm ở đoạn mã khác so với lệnh tiếp theo sau lệnh JMP Chương trình sẽ căn cứ vào vị trí NHAN để xác định giá trị địa chỉ nhảy đến (CS:IP của NHAN) SAu đó:
IPIP của NHAN
CSCS của NHAN
Các cờ bị thay đổi: không
JE (nhảy nếu bằng nhau)
Dạng lệnh: JE NHAN
Mô tả: IPIP+dịch chuyển
Lệnh trên biểu diễn thao tác nhảy cso điều kiện với NHAN nếu ZF=1 NHAN phải nằm cách xa một khoảng -128…+127 byte so với lệnh tiếp theo sau lệnh JE
Chương trình sẽ căn cứ vào vị trí NHAN để xác định giá trị dịch chuyển
Các cờ bị thay đổi: không
Ví dụ: SUB AL,10H ;tru AL cho 10H
JE THOI ;nhay den THOI neu AL bang 10H
Dạng lệnh: LOOP NHAN
Mô tả: lệnh này dùng để lặp lại đoạn chương trình(gồm các lệnh nằm trong khoảng từ NHAN đến hết lệnh LOOP NHAN) cho đến khi số lần lặp CX=0
NHAN phải nằm cách xa tối đa -128byte so với lệnh tiếp theo sau lệnh LOOP Các cờ bị thay đổi: không
Ví dụ:
Trang 5MOV AL, 0 ;xoa AL
MOV CX, 10 ;nap so lan lap vao CX
LAP: INC AL ;tang AL len 1
LOOP LAP ;lap lai 10 lan, AL=10
Dạng lệnh: DIV Nguồn
Toán hạng Nguồn lá số chia Tùy theo độ dài toán hạng Nguồn ta có hai trương hợp bố trí phép chia:
+ Nếu Nguồn là so 8 bit: AX/Nguồn, thương để vào AL, số dư để vào AH
+ Nếu Nguồn là so 16 bit: AX/Nguồn, thương để vào AX, số dư để vào DX Nếu thương không phải là số nguyên nó được làm tron theo số sát dưới Nếu Nguồn bằng 0 hoặc thương thu được lớn hơn FFH hoặc FFFFH(tùy theo đọ dài của toán hạng nguồn) thi 8086 thực hiện lệnh ngắt INT 0
Các cờ bị thay đổi : không
Ví dụ:
MOV AX, 0033H ;chuyen 0033H vao AX
MOV BL, 25 ;AL=02 va AH=01H
POP (lấy lại 1 từ vào thanh ghi từ đỉnh ngăn xếp)
Dạng lệnh: POP Đích
Mô tả: Đích{SP}
SPSP+2
Toán hạng đích đích có thể là các thanh ghi đa năng, thanh ghi đoạn (nhưng không được là thanh ghi đoạn mã CS) hoặc ô nhớ
Các cờ bị thay đổi: không
Ví dụ:
POP DX ;lay 2 byte vao dinh ngan xep dua vao DX
Dạng lệnh: XOR Đích, Nguồn
Lệnh XOR thực hiện logic XOR (hoặc đảo) giưac hai toán hạng và kết quả được lưu vào trong đích Nếu toán hạng đích trung toán hạng nguồn thì kết quả bằng 0,
do đó lệnh còn được dùng để xóa thanh ghi về 0 kèm theo các cờ CF và Ò cũng bị xóa
Các cờ bị thay đổi: CF, OF, PF, SF, ZF
Ví dụ:
XOR AX, AX
XOR BX, BX
MOV AX, 5857H
MOV BX, 58A8H
XOR AX, BX
Bước 5: Trình bày các chương trình con thực hiện các chức năng chính: Bài làm chính:
model small
stack 100
Trang 6data
tb1 db 'nhap vao 1 chuoi ky tu:$'
tb2 db 13,10,'so lan ky tu xuat hien trong xau la:$'
tb3 db 13,10,'ban co muon nhap tiep khong y/n?:$'
A db 100 dup(?)
n db 0
c db 10
dem db 0
code
main proc
mov ax,@data
mov ds,ax
mov ah,9
lea dx,tb1
int 21h
lea si,A
xor cx,cx
nhap:
mov ah,1
int 21h
cmp al,13
je thoinhap
mov [si],al
inc si
inc cx
jmp nhap
Trang 7thoinhap:
mov n,cl
lai:
mov cl,n
xor ax,ax
mov dem,0
lea si,A
sosanh:
cmp [si],61h
je tangdem
jmp lap
tangdem:
inc dem
lap:
inc si
loop sosanh
; hienthi
mov ah,9
lea dx,tb2
int 21h
xor ax,ax
mov al,dem
chia:
div c
xor bx,bx
mov bl,ah
push bx
Trang 8inc cx
cmp al,0
je hienthi
xor dx,dx
mov dl,al
xor ax,ax
mov ax,dx
jmp chia
hienthi:
xor dx,dx
layra:
pop dx
add dl,30h
mov ah,2
int 21h
loop layra
mov ah,9
lea dx,tb3
int 21h
mov ah,1
int 21h
cmp al,79h
je lai
; ve dos
mov ah,4ch
int 21h
main endp
Trang 9end main
Bước 6: Trình bày các đoạn mã lệnh trong bài và ý nghĩa dùng chúng.
model small khai báo kiểu chương trình (kiểu small)
stack 100 khai báo kích thước ngăn xếp
data
tb1 db 'nhap vao 1 chuoi ky tu:$'
tb2 db 13,10,'so lan ky tu xuat hien trong xau la:$'
tb3 db 13,10,'ban co muon nhap tiep khong y/n?:$'
A db 100 dup(?)
n db 0
c db 10
Khai báo biến dùng trong bài
Khai báo các thông báo sẽ hiển thị trên màn hình
Khai báo các thông báo sẽ hiển thị trên màn hình
Trang 10dem db 0
code
main proc
mov ax,@data
mov ds,ax
mov ah,9
lea dx,tb1
int 21h
lea si,A
xor cx,cx
nhap:
mov ah,1 đặt con trỏ vào vị trí đầu tiên của xâu
int 21h Ngắt để chuyển sang màn hình và bắt đầu nhập các kí tự
cmp al,13
je thoinhap
mov [si],al
inc si
inc cx
jmp nhap
thoinhap:
mov n,cl
lai:
mov cl,n
xor ax,ax
Hiển thị ra màn hình dòng thông báo tb1
và đưa kích thước xâu A vào SI, đặt cx=0 Chương trình chính
kiểm tra các ký tự vừa nhập vào al đã kết thúc chưa, (kết thúc nhập bằng việc ấn phím Enter), nếu như kết thúc bằng phím Enter
thì sau khi nhập và hiển thị hết các kí tự thì sẽ nhảy tới thoinhap
Nhập tuần tự các ký tự mà đã nhập từ bàn phím vào SI thông qua al
Trang 11mov dem,0 đặt giá trị cho dem = 0
lea si,A
sosanh:
cmp [si],61h
je tangdem
jmp lap
tangdem:
inc dem
lap:
inc si
loop sosanh
; hienthi
mov ah,9
lea dx,tb2
int 21h
xor ax,ax
mov al,dem
chia:
div c
xor bx,bx
mov bl,ah
push bx
inc cx
Kiểm tra xâu ký tự đã nhập trong SI với ký
tự “a” =61h Nếu mà có ký tự trùng với a
thì nhảy đến tangdem còn không thì nhảy
đến lap
Tăng SI thêm 1( tức là đến ký tự tiếp theo) và lặp lại
đoạn chương trình sosanh
Hiển thị thông báo tb2
Chuyển số lần đếm được ký tự “a”
thành ký tự (là một từ) và cất từ đó vào ngăn xếp, nếu al mà bằng 0 (tức
là không nhập gì từ bàn phím) thì
nhảy tới hienthi
Trang 12cmp al,0
je hienthi
xor dx,dx
mov dl,al
xor ax,ax
mov ax,dx
jmp chia
hienthi:
xor dx,dx
layra:
pop dx
add dl,30h
mov ah,2
int 21h
loop layra
mov ah,9
lea dx,tb3
int 21h
mov ah,1
int 21h
cmp al,79h
je lai
; ve dos
mov ah,4ch
Chuyển số vừa nhận được sang dạng chữ (hay chữ
số)
So sánh ký tự vừa nhập có phải là “y” =
79h không, nếu đúng thì nhảy về lai
Hiển thị thông báo tb3 ra màn hình và
đưa con trỏ ở vị trí đầu tiên
Hiển thị thông báo tb3 ra màn hình và
đưa con trỏ ở vị trí đầu tiên
Lấy chức năng in ký tự ra màn hình
Thoát chương trình
Trang 13int 21h
main endp
end main
6 Tài Liệu tham khảo:
1 Bài giảng Vi Xử Lý – Vi Điều Khiển, Bộ môn Kỹ Thuật Máy Tính, Trường ĐHKTCN Thái
Nguyên, năm 2011
2 Tống Văn On, Họ vi điều khiển 8051, NXB KH&KT, 2005
3 Mạng Internet, tailieuit.com, diendantdh.forum.com