PRACTICE EXERCISES OF THE MICROPROCESSORS &
MICROCONTROLLERS
Instructor: The Tung Than
Student's name:Banh Tri Kiet
Student code: 21522251
PRACTICE REPORT NO 5
<NAME OF PRACTICE EXERCISE >
I.
Content 1
II.
III.
Content 2
Exercises
IV.
References
Code
Giải thích
.model small
.stack 100h
.data
Data khai báo các biến
Nhap1 db 'Nhap so thu nhat: $'
Nhap2 db 'Nhap so thu hai: $'
XuatTran db 'So da bi tran $'
XuatTong db 'Tong hai so la: $'
XuatHieu db 'Hieu hai so la: $'
XuatAm db 'Ket qua bi am $'
NumXL1 dd ?
NumXL2 dd ?
num1 dd ?
Các số sẽ có dạng
num2 dd ?
Số thứ nhất (num1(16bitcao),num2(16bitthap))
num3 dd ?
Số thứ hai (num3(16bitcao),num4(16bitthap))
num4 dd ?
sum1 dd ?
sum2 dd ?
tru1 dd ?
tru2 dd ?
CLRF db 13, 10, '$'
Chứa ký tự xuống dòng
.code
main proc
mov ax, @data
Hàm main
Nạp các data
mov ds, ax
mov ah, 9
Hiển thị "Nhap so thu nhat = "
lea dx, Nhap1
int 21h
call inputBina
Gọi hàm để nhập số thứ nhất
mov ah, 9
Xuống dòng
lea dx, CLRF
int 21h
call SoThuNhat
Xử lý số vừa được nhập
mov ah, 9
Hiển thị ‘Nhap so thu hai: ‘
lea dx, Nhap2
int 21h
call inputBina
Nhập số thứ hai
call SoThuHai
Gọi hàm xử lý số thứ hai
mov ah, 9
Xuống dòng
lea dx, CLRF
int 21h
mov ah, 9
Hiển thị ‘Tổng hai số’
lea dx, XuatTong
int 21h
call Sum
Gọi hàm tính tổng
mov ah, 9
Xuống dòng
lea dx, CLRF
int 21h
call outputBina
Gọi hàm xuất tổng
mov ah, 9
Xuống dòng
lea dx, CLRF
int 21h
mov ah, 9
Hiển thị ‘Hieu hai so: ‘
lea dx, XuatHieu
int 21h
Xuống dòng
mov ah, 9
lea dx, CLRF
int 21h
call Tru
Gọi hàm tính hiệu
call outputTru
Xuất hiệu
main endp
Kết thúc hàm main
inputBina proc
Hàm nhập
batdau:
mov ah, 1
Nhập 1 số
int 21h
mov bx,0
mov dx,0
mov cx,0
tieptuc:
cmp al, '0'
jnge KhongDung
Kiểm tra số vừa nhập xem có khác 0 hoặc 1 thì
nhảy đến hàm khơng đúng
cmp al, '1'
jnle KhongDung
add dx,1
Tăng dx để đếm số lần nhập
and ax, 000fh
Chuyển ax từ chuỗi thành số
SHL bx,1
Dịch trái bx (bx chứa 16 bit cao)
pushf
Lưu lại cờ dịch
add bx,ax
Gán trọng số vừa nhập vào số thấp nhất của bx
popf
Lấy lại cờ
JNO Next
Kiểm tra xem có tràn số trong bx không ( tức là bx
đã chứa đủ 16bit chưa)
mov ax,0
Nếu chưa tràn thì tiếp tục nhập nếu đủ thì nhảy đến
hàm check và reset ax
jmp check
ret
Xử lý nếu nhập số lớn hơn 16 bit
Hàm để xử lý 2 số 16 bit
haiso:
Kiểm tra số vừa nhập xem có khác 0 hoặc 1 hay
không
cmp al, '0'
jnge KhongDung
cmp al, '1'
jnle KhongDung
and ax, 000fh
Đổi kí tự vừa nhập thành số
check:
Dịch trái cx ( cx chứa 16 bit thấp)
SHL cx,1
Cộng giá trị vừa nhập vào cx
add cx,ax
mov ah, 1
Nhập 1 ký tự
int 21h
Tăng giá trị của dx lên 1
add dx,1
cmp al, 13
; da enter chua?
Kiểm tra phím nhấn phải nút enter khơng
Nếu khơng thì xử lý tiếp
jne haiso
sub dx,1
mov NumXL2,dx
ret
Nếu phải thì trừ dx đi 1 ( vì enter khơng tính )
Lưu số lượng số nhập vào NumXL2
Next:
Xử lý của nhập 16 bit cao
mov ah, 1
Kiểm tra vừa nhập phải enter
int 21h
cmp al, 13
; da enter chua?
jne tiepTuc
Khơng thì tiếp tục
sub dx,1
Phải thì trù dx đi 1
mov NumXL2,dx
Lưu độ dài số nào NUMXL2
ret
KhongDung:
mov ah, 2
Nếu nhập sai định dạng
Thì nhập lại từ đầu
mov dl, 0dh
int 21h
mov dl, 0ah
int 21
jmp batdau
inputBina endp
Kết thúc hàm nhập
SoThuNhat proc
Hàm xử lý số thứ nhất
(Vì khi nhập x bit bất kì thì hàm nhập sẽ lưu số ở
dạng 16 bit cao và x-16 bit thấp nên t cần đưa về lại
x-16 bit cao và 16 bit thấp)
MOV num2,cx
Lưu bit thấp vào num2
MOV NumXL1,bx
Lưu 16 bit cao vào num XL1
cmp NumXL2,16
Kiểm tra số vừa nhập có lớn hơn 16 bit hay khơng
JLE do
Nếu khơng lớn hơn bằng thì nhảy tới hàm do
sub NumXL2,16
Khơng thì trừ numxl2 đi cho 16
again1:
cmp NumXL2,0
So sánh numxl2 đã bằng 0 chưa
JNE Dichbit1
Nếu chưa bằng 0 thì dịch bit
add num2,bx
Nếu đã bằng thì cộng bx vào num 2 và kết thúc
ret
Dichbit1:
ROL bx,1
Dịch trái bx với biến cờ nhớ
JC setbit1
Nếu cờ là 1 thì nhảy tới setbit1 nếu 0 thì tiếp tục
and bx,0FFFEh
Cho bit có trọng số thấp nhất của bx =0
SHL num1,1
Dịch trái num1 đi 1
sub NumXL2,1
Giảm biến đếm của số lần lặp
jmp again1
Lặp tiếp
setbit1:
Hàm setbit1
and bx,0FFFEh
Cho trọng số thấp nhất của bx là 0
SHL num1,1
Dịch trái num1 và cộng thêm 1
add num1,1
sub NumXL2,1
Giảm biến đếm
jmp again1
Lặp lại
do:
Nếu trừ bị âm thì numxl2=0
mov NumXL2,0
Nhảy vào vịng lặp
jmp again1
SoThuNhat endp
Kết thúc hàm xử lý
;ham so thu hai
Giải thích hàm xử lý tổng quát:
Ta đếm xem số bit của thanh ghi chứa bit thấp là
bao nhiêu bit
Sau đó ta dịch số bit cao bằng số lần tương ứng và
lấy những số dư sau mỗi lần dịch vào số bit
cao(num1)
Sau khi đã dịch đủ số lần thì ta cộng kết quả của số
bit cao (bx) vào cx ta sẽ được 16 bit thấp và x-16
bit cao
SoThuHai proc
MOV num4,cx
MOV NumXL1,bx
cmp NumXL2,16
JLE do2
sub NumXL2,16
again2:
cmp NumXL2,0
JNE Dichbit2
add num4,bx
Hàm xử lý số thứ 2 tương tự xử lý số thứ nhất
ret
Dichbit2:
SHR cx,1
ROL bx,1
;and bx,0FFFEh
JC setbit2
and bx,0FFFEh
SHL num3,1
sub NumXL2,1
jmp again2
setbit2:
and bx,0FFFEh
SHL num3,1
add num3,1
sub NumXL2,1
jmp again2
do2:
mov NumXL2,0
jmp again2
SoThuHai endp
Kết thúc hàm xử lý số thứ hai
Sum proc
Hàm tính tổng
mov cx,num4
Cx chứa num4
adc cx,num2
Cộng có dư vào num2
jc du
Nếu có dư thì nhảy tới hàm dư
mov sum2,cx
Khơng thì lưu giá trị vừa nhập vào sum có 16 bit
thấp ( sum2)
mov bx,num3
Bx chứa num3
adc bx,num1
Cộng có dư với num1( 16 bit cao)
jc tran
Nếu tràn thì nhảy tới hàm tràn
mov sum1,bx
Khơng tràn thì lưu giá trị vào sum1 và kết thúc
ret
du:
mov sum2,cx
Hàm dư tương tự như trên nhưng cộng thêm 1 do
mov bx,num3
dư số từ bit thấp sang
adc bx,num1
jc tran
Nếu tràn thì xử lý tràn
mov sum1,bx
ret
tran:
Tràn
mov sum1,bx
Hiển thị thông báo số bị tràn
mov ah, 9
lea dx, XuatTran
int 21h
Ký trự xuống dòng
mov ah, 9
lea dx, CLRF
int 21
ret
Sum endp
Kết thúc hàm
Tru proc
Hàm xử lý trừ
Mov cx,num2
sub cx,num4
Lấy num2 trừ num4
jnc trutiep
Nếu số khơng âm thì trừ tiếp
add num3,1
Nếu âm thì cộng cho số bị trừ thêm 1
trutiep:
Trừ tiếp
mov Tru2,cx
Lưu cx vào tru2( cx vừa được tính phía trên)
mov bx,num1
Lấy num1 trừ num3
sub bx,num3
jc am
Nếu kết quả âm thì nhảy tới hàm âm
mov Tru1,bx
Lưu kết quả vào tru1
ret
am:
Hiển thị thông báo kết quả là 1 số âm (dạng bù 2)
mov Tru1,bx
mov ah, 9
lea dx, XuatAm
int 21h
ret
Tru endp
Kết thúc hàm trừ
;ham xuat
outputBina proc
mov cx,16
Hàm xử lý tổng
Lưu 16 vào cx để lặp lại 16 lần
mov ah,2
lapdau:
Lặp 16 bit cao
mov bx,sum1
and bx,32768
And số lớn nhất của sum1 với 1
cmp bx,0
Kiểm tra có bằng 0 hay khơng
je sokhong
Nếu cos thì hiện số khơng cịn khơng thì hiện số 1
mov dl,'1'
int 21h
jmp tiep2
sokhong:
mov dl,'0'
int 21h
tiep2:
Tiếp tục
SHL sum1,1
Dịch trái để lấy được số tiếp theo( hiển thị số từ trái
sang)
Loop lapdau
Kiểm tra nếu cx chưa bằng 0 thì tiếp tục lặp
mov cx,16
Thực hiện tương tự như trên nhưng là 16 bit số thấp
mov ah,2
lap:
mov bx,sum2
and bx,32768; and so lon nhat cua num1 vs 1
cmp bx,0
je sokhonghai
mov dl,'1'
int 21h
jmp tiep
sokhonghai:
mov dl,'0'
int 21h
tiep:
SHL sum2,1
Loop lap
ret
outputBina endp
outputTru proc
mov cx,16
mov ah,2
lapdau1:
mov bx,tru1
and bx,32768; and so lon nhat cua num1 vs 1
cmp bx,0
je sokhong1
mov dl,'1'
int 21h
jmp tiep3
Hàm xử lý xuất trừ thực hiện tương tự hàm xử lý
xuất tổng
sokhong1:
mov dl,'0'
int 21h
tiep3:
SHL tru1,1
Loop lapdau1
mov cx,16
mov ah,2
lap1:
mov bx,tru2
and bx,32768; and so lon nhat cua num1 vs 1
cmp bx,0
je sokhonghai1
mov dl,'1'
int 21h
jmp tiep1
sokhonghai1:
mov dl,'0'
int 21h
tiep1:
SHL tru2,1
Loop lap1
outputTru endp
Kết thúc hàm xuất hiệu
Kết thúc chương trình
end
Link google drive:
/>