Tải bản đầy đủ (.pdf) (11 trang)

Báo cáo thực hành lab5 vi xử lý vi điều khiển UIT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (101.39 KB, 11 trang )

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:
/>


×