Đồ Án Lập Trình Hệ Thống Bài Tập 1 (Assembly) 1. Viết chương trình sử dụng hàm 7, ngắt 21h để nhận 1 ký tự từ bàn phím, dùng 1 biến để lưu trữ ký tự nhận được (do sinh viên tự đặt tên biến), sau đó sử dụng hàm 2, ngắt 21h để in ra màn hình ký tự nhận được đang lưu trong biến ấy. Chương trình phải có đủ các câu thông báo nhập và xuất. Ví dụ: Hay go 1 phim: B Ky tu nhan duoc la: B 2. Làm lại chương trình bài 1 sao cho không cần sử dụng biến để lưu trữ ký tự mà kết quả chạy chương trình vẫn không thay đổi.
Trang 1Đồ Án Lập Trình Hệ Thống Bài Tập 1 (Assembly)
1 Viết chương trình sử dụng hàm 7, ngắt 21h để nhận 1 ký tự từ bàn phím, dùng 1 biến để lưu trữ ký tự nhận được (do sinh viên tự đặt tên biến), sau đó sử dụng hàm
2, ngắt 21h để in ra màn hình ký tự nhận được đang lưu trong biến ấy Chương trình phải có đủ các câu thông báo nhập và xuất
Ví dụ: Hay go 1 phim: B
Ky tu nhan duoc la: B
2 Làm lại chương trình bài 1 sao cho không cần sử dụng biến để lưu trữ ký tự mà kết quả chạy chương trình vẫn không thay đổi
3 Viết chương trình nhận 1 ký tự từ bàn phím, sau đó in ra màn hình ký tự kế
trước và kế sau của ký tự vừa nhập
Ví dụ: Hay go 1 phim: B
Ky tu ke truoc : A
Ky tu ke sau : C
4 Viết chương trình cho phép nhập từ bàn phím tên của 1 người, sao đó in ra màn hình chuỗi có dạng như sau:
Xin chao <tên_đã_nhập>
Ví dụ: Khi chạy chương trình, nhập vào là: Nguyen Van A
Chuỗi in ra màn hình sẽ là: Xin chao Nguyen Van A
5 Viết chương trình cho nhập 1 ký tự từ màn hình và xuất câu thông báo tương ứng sau:
- Nếu ký tự nhập là ‘S’ hay ‘s’ thì in ra “Good morning!”
- Nếu ký tự nhập là ‘T’ hay ‘t’ thì in ra “Good Afternoon!”
- Nếu ký tự nhập là ‘C’ hay ‘c’ thì in ra “Good everning!”
6 Viết chương trình nhập từ bàn phím 1 ký tự thường Sau đó in ra màn hình lần lượt
các ký tự từ ký tự nhận được đến 'z' sao cho giữa các ký tự có 1 khoảng trống
.model small
.stack 100h
.data
tb1 db 'nhap vao 1 ki tu
thuong: $'
tb2 db ' $'
tb3 db 10,13,'nhap lai 1 ki
tu $'
tb4 db 10,13, 'chuoi ki tu
theo yeu cau la: $'
kitu db 0
.code
main proc
mov ax,@data
mov ds,ax
lea dx,tb1 mov ah,9 int 21h nhap:
mov ah,1 int 21h cmp al,'a'
jl nhaplai cmp al,'z'
jg nhaplai jmp hienthi
nhaplai:
lea dx,tb3 mov ah,9 int 21h
jmp nhap
hienthi: mov kitu,al lea dx,tb4 mov ah,9 int 21h lap:
mov dl,kitu mov ah,2 int 21h lea dx,tb2 mov ah,9 int 21h inc kitu cmp kitu,'z'
jg ketthuc
Trang 2jmp lap
ketthuc:
mov ah,4ch
int 21h main endp end main
7 Không dùng hàm 0Ah/21h, hãy dùng lệnh lặp để viết chương trình nhập vào 1
chuỗi ký tự Sau khi nhập xong đếm xem chuỗi có bao nhiêu ký tự In ra màn hình
chuỗi nhận được và số ký tự có trong chuỗi
Ví dụ: S = "Hello world !" ==> Số kí tự trong chuỗi là 13
.MODEL SMALL
.STACK 100
.DATA
DEM DW 0
MANG DB 100
DUP(?)
TB1 DB "NHAP
CHUOI: $"
TB2 DB 10,13,"IN
CHUOI: $"
TB3 DB 10,13,"SO KT
TRONG CHUOI: $"
SO_KT DW 0
CHIA10 DW 10
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,9
LEA DX,TB1
INT 21H
XOR BX,BX
NHAP:
MOV AH,1
INT 21H
CMP AL,0DH
JE XU_LY MOV MANG[BX],AL INC BX LOOP NHAP XU_LY:
MOV CX,BX MOV SO_KT,BX
MOV AH,9 LEA DX,TB2 INT 21H MOV AH,2
XOR BX,BX HIEN_THI:
MOV DL,MANG[BX]
INC BX INT 21H LOOP HIEN_THI
MOV AH,9
LEA DX,TB3 INT 21H
XOR AX,AX MOV AX,SO_KT XOR CX,CX KI_TU:
XOR DX,DX DIV CHIA10 PUSH DX INC CX CMP AX,0 JNE KI_TU MOV AH,2
HIEN_SO:
POP DX ADD DL,30H INT 21H LOOP HIEN_SO MOV AH,4CH INT 21H MAIN ENDP END MAIN
8 Viết chương trình cho phép nhập vào một chuỗi bất kỳ Sau đó:
- Đổi tất cả ký tự thường thành ký tự hoa và in ra màn hình
- Đổi tất cả ký tự hoa thành ký tự thường và in ra màn hình
Ví dụ: S = ‘weLcOme To AssEmblY’
In ra: welcome to assembly - WELCOME TO ASSEMBLY
.MODEL SMALL
.STACK 100
.DATA
TB1 DB 'NHAP CHUOI:
$'
TB2 DB 10,13, 'CHUOI
KI TU HOA: $'
TB3 DB 10,13, 'CHUOI
KI TU THUONG: $'
MANGNHAP DB 100 DUP (?)
MANGTHUONG DB
100 DUP (?) MANGHOA DB 100 DUP (?)
KITU DW 0
.CODE
MAIN PROC
MOV AX,@DATA MOV DS,AX
LEA DX,TB1 MOV AH,9 INT 21H ;NHAP CHUOI LEA DI,MANGNHAP
Trang 3MOV CX,0
LAPNHAP:
MOV AH,1
INT 21H
CMP AL,13
JE DUNGNHAP
MOV [DI],AL
INC DI
INC CX
JMP LAPNHAP
DUNGNHAP:
MOV KITU,CX
;NHAP MANG CHU
THUONG
LEA DI,MANGNHAP
LEA
SI,MANGTHUONG
MOV CX,KITU
LAMLAI:
CMP [DI],5AH
JLE SSTIEP
JMP
KHONGCHUYEN
SSTIEP:
CMP [DI],41H
JGE CVTHUONG
JMP
KHONGCHUYEN
CVTHUONG:
MOV AX,[DI]
ADD AX,20H
MOV [SI],AX
INC SI
INC DI
JMP FINI
KHONGCHUYEN:
MOV AX,[DI]
MOV [SI],AX INC DI INC SI FINI:
LOOP LAMLAI ;NHAP MANG CHU HOA
LEA DI,MANGNHAP LEA SI,MANGHOA MOV CX,KITU LAMLAI1:
CMP [DI],61H JGE CVHOA JMP
KHONGCHUYEN1 CVHOA:
MOV AX,[DI]
SUB AX,20H MOV [SI],AX INC SI INC DI JMP FINI1 KHONGCHUYEN1:
MOV AX,[DI]
MOV [SI],AX INC SI INC DI FINI1:
LOOP LAMLAI1
;IN XAU HOA LEA DX,TB2
MOV AH,9 INT 21H
LEA DI,MANGHOA MOV CX,KITU LAPIN:
MOV DL,[DI] MOV AH,2 INT 21H INC DI LOOP LAPIN ;IN XAU THUONG LEA DX,TB3 MOV AH,9 INT 21H
LEA DI,MANGTHUONG MOV CX,KITU LAPIN1:
MOV DL,[DI] MOV AH,2 INT 21H INC DI LOOP LAPIN1
EXIT:
MOV AH,4CH INT 21H MAIN ENDP END MAIN
9 Nhập vào 2 chuỗi số, đổi 2 chuỗi thành số, sau đó cộng hai số, đổi ra chuỗi và xuất chuỗi tổng
Ví dụ: S1 = "123" => N1 = 123
S2 = "456" => N2 = 456
N = N1 + N2 = 123 + 456 = 579 => S = "579" (xuất S ra màn hình)
10 Nhập 2 số nguyên dương A, B Tính A/B, A*B (không dùng lệnh DIV, MUL) và
in ra màn hình kết quả
Ví dụ: A=18, B=3
Tính A/B: 18 - 3 - 3 - 3 - 3 - 3 - 3 = 0, vậy A/B = 6 (tổng trừ B cho đến khi A = 0)
Tính A*B = 18 + 18 + 18 = 54
;CHUA CO KIEM TRA
SO A>B OR B>A
Trang 4;CHUA CO KIEM TRA
CHIA HET HAY
KHONG CHIA HET
.MODEL SMALL
.STACK 100
.DATA
TB1 DB 'SO THU
NHAT: $'
TB2 DB 10,13,'SO THU
HAI : $'
TB3 DB 10,13, 'TICH
HAI SO: $'
TB4 DB 10,13,
'THUONG HAI SO: $'
TICH DW 0
THUONG DW 0
SOTG DW 0
SO1 DW 0
SO2 DW 0
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,9
LEA DX,TB1
INT 21H
CALL NHAPSO
MOV SO1,AX
MOV AH,9 LEA DX,TB2 INT 21H
CALL NHAPSO MOV SO2,AX
TICH2SO:
MOV CX,SO1 MOV BX,SO2 DEC CX LAPTICH:
ADD BX,SO2
MOV TICH,BX LOOP LAPTICH
THUONG2SO:
MOV CX,0 MOV AX,SO1 MOV BX,SO2 LAPTHUONG:
SUB AX,BX INC CX
CMP AX,BX JGE LAPTHUONG MOV THUONG,CX
LEA DX,TB3 MOV AH,9 INT 21H MOV AX,TICH CALL HIENTHI
LEA DX,TB4 MOV AH,9 INT 21H MOV AX,THUONG CALL HIENTHI
MOV AH,4CH INT 21H
NHAPSO PROC MOV CX,10 START:
MOV AH,1 INT 21H CMP AL,13
JE THOATCTC SUB AL,30H
Trang 5MOV AH,0
MOV BX,AX
MOV AX,SOTG
MUL CX
ADD AX,BX
MOV SOTG,AX
JMP START
THOATCTC:
MOV AX,SOTG
MOV SOTG,0
RET
NHAPSO ENDP HIENTHI PROC
XOR CX,CX MOV BX,10 LAPHT:
XOR DX,DX INC CX DIV BX PUSH DX CMP AX,0
JNE LAPHT MOV AH,02H INRA:
POP DX ADD DL,30H INT 21H LOOP INRA RET
HIENTHI ENDP END MAIN
11 Viết chương trình nhập 2 số nhị phân 16 bit A và B Sau đó in ra màn hình các kết quả ở dạng nhị phân: A + B, A – B, A and B, A or B
Ví dụ: Nhập số nhị phân A: 10101010
Nhập số nhị phân B: 01010101
A + B = 11111111 A – B
= 01010101
A and B = 00000000 A or
B = 11111111
.MODEL SMALL
.STACK 100H
.DATA
SOA DW 0
SOB DW 0
LUU DW 0
TB1 DB "NHAP SO
A: $"
TB2 DB 10,13,"NHAP
SO B: $"
TB3 DB 10,13,"A+B=
$"
TB4 DB 10,13,"A-B=
$"
TB5 DB 10,13,"A
AND B= $"
TB6 DB 10,13,"A OR
B= $"
KQ DW 0
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,9 LEA DX,TB1 INT 21H
CALL NHAPSO
MOV SOA,DX
MOV AH,9 LEA DX,TB2 INT 21H
CALL NHAPSO MOV SOB,DX
;
_
MOV AX,SOA AADDB:
ADD AX,SOB MOV KQ,AX
MOV AH,9 LEA DX,TB3 INT 21H
CALL INSO
MOV AX,SOA ASUBB:
SUB AX,SOB MOV KQ,AX
MOV AH,9 LEA DX,TB4 INT 21H
CALL INSO
MOV AX,SOA
AANDB:
AND AX,SOB MOV KQ,AX
MOV AH,9 LEA DX,TB5 INT 21H
Trang 6
CALL INSO
MOV AX,SOA
AORB:
OR AX,SOB
MOV KQ,AX
MOV AH,9
LEA DX,TB6
INT 21H
CALL INSO
MOV AH,4CH
INT 21H
MAIN ENDP
INSO PROC MOV CX, 16 MOV AH,2 HIEN_THI:
XOR DX,DX SHL KQ,1 ADC DL,30H INT 21H LOOP HIEN_THI RET
INSO ENDP
PROC NHAPSO XOR DX,DX XOR BX,BX NHAP:
MOV AH,1 INT 21H CMP AL,"0"
JL NHAP CMP AL,"1"
JG NHAP AND AL,0FH SHL DX, 1
OR DL,AL INC BX CMP BX,16 JNE NHAP RET
NHAPSO ENDP
END MAIN
12 Viết chương trình nhập 1 ký tự từ bàn phím, sau đó in ra màn hình mã ASCII của
ký tự nhận được ở dạng thập lục phân, thập phân và nhị phân
Ví dụ: Nhập 1 ký tự: A
Mã ASCII dạng Hex: 41h
Mã ASCII dạng Dec: 65
Mã ASCII dạng Bin: 01000001b
.MODEL SMALL
.STACK 100
.DATA
TB1 DB "VUI LONG
NHAP KI TU: $"
TB2 DB 10,13,"Ma
ASCII dang DEC: $"
TB3 DB 10,13,"Ma
ASCII dang BIN: $"
TB4 DB 10,13,"Ma
ASCII dang HEX: $"
KITU DB 0
sochia dw 10
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,09H LEA DX,TB1 INT 21H
MOV AH,01H INT 21H
MOV KITU,AL
MOV AH,09H LEA DX,TB2 INT 21H
HT_THAPPHAN:
XOR DX, DX XOR CX,CX XOR AX,AX
MOV AL,KITU chia:
DIV sochia PUSH DX INC CX XOR DX, DX CMP AX, 0 JNE chia
MOV AH, 2 HT:
pop DX ADD DL, 30H int 21h
Trang 7LOOP HT
MOV AH,09H
LEA DX,TB3
INT 21H
MOV CX,8
XOR BX,BX
MOV BH,KITU
HT_NHIPHAN:
XOR DX,DX
MOV AH, 2
SHL BH, 1
ADC DL, 30h
;ADD DL, 30H
int 21h
;MOV [SI], DL
;INC SI
LOOP HT_NHIPHAN
MOV AH,9 LEA DX,TB4 INT 21H
XOR BX,BX MOV BH,KITU MOV CX,2
IN_HEX:
MOV DL,BH SHR DL,4 CMP DL,10
JB IN_SO ADD DL,37H
JMP IN_CHU
IN_SO:
ADD DL,30H IN_CHU:
MOV AH,2 INT 21H SHL BX,4
LOOP IN_HEX
mov ah, 4ch int 21h main endp end main
13 Viết lại chương trình bài 11 nhưng 2 số A và B được nhập theo dạng thập lục
phân Các kết quả được in ra màn hình ở dạng nhị phân
.MODEL SMALL
.STACK 100
.DATA
SOA DW 0
SOB DW 0
LUU DW 0
TB1 DB "NHAP SO
A: $"
TB2 DB 10,13,"NHAP
SO B: $"
TB3 DB 10,13,"A+B=
$"
TB4 DB 10,13,"A-B=
$"
TB5 DB 10,13,"A
AND B= $"
TB6 DB 10,13,"A OR
B= $"
KQ DW 0
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,9
LEA DX,TB1 INT 21H
CALL NHAPSO
MOV SOA,BX
MOV AH,9 LEA DX,TB2 INT 21H
CALL NHAPSO MOV SOB,BX
;
_
MOV AX,SOA AADDB:
ADD AX,SOB MOV KQ,AX
MOV AH,9 LEA DX,TB3
INT 21H
CALL INSO
MOV AX,SOA ASUBB:
SUB AX,SOB MOV KQ,AX
MOV AH,9 LEA DX,TB4 INT 21H
CALL INSO
MOV AX,SOA
AANDB:
AND AX,SOB MOV KQ,AX
MOV AH,9 LEA DX,TB5 INT 21H
Trang 8CALL INSO
MOV AX,SOA
AORB:
OR AX,SOB
MOV KQ,AX
MOV AH,9
LEA DX,TB6
INT 21H
CALL INSO
MOV AH,4CH
INT 21H
MAIN ENDP
INSO PROC MOV CX, 16 MOV AH,2 HIEN_THI:
XOR DX,DX SHL KQ,1 ADC DL,30H INT 21H LOOP HIEN_THI RET
INSO ENDP
NHAPSO PROC MOV CX,4 XOR BX,BX NHAP:
MOV AH,1 INT 21H
CMP AL,"0"
JL NHAP CMP AL,"9"
JG CHU_CAI JMP SO CHU_CAI:
CMP AL,"A"
JL NHAP CMP AL,"F"
JG NHAP SUB AL,7H SO:
SUB AL,30H XOR AH,AH SHL BX,4
OR BL,AL LOOP NHAP RET
NHAPSO ENDP
14 Viết lại chương trình bài 11 nhưng 2 số A và B được nhập theo dạng thập phân
In các kết quả ở dạng thập phân: A + B, A – B
.MODEL SMALL
.STACK 100
.DATA
SOA DW 0
SOB DW 0
CHIA10 DW 10
TB1 DB "NHAP SO
A: $"
TB2 DB 10,13,"NHAP
SO B: $"
TB3 DB 10,13,"A+B=
$"
TB4 DB 10,13,"A-B=
$"
KQ DW 0
TONG DW 0
NHAN10 DW 10
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,9
LEA DX,TB1
INT 21H
CALL NHAPSO
MOV AX,TONG MOV SOA,AX
MOV AH,9 LEA DX,TB2 INT 21H
CALL NHAPSO
MOV AX,TONG MOV SOB,AX
;
_
MOV AX,SOA AADDB:
ADD AX,SOB
MOV KQ,AX
MOV AH,9 LEA DX,TB3 INT 21H
CALL INSO
MOV AX,SOA ASUBB:
SUB AX,SOB MOV KQ,AX
MOV AH,9 LEA DX,TB4 INT 21H
CALL INSO
MOV AH,4CH INT 21H
MAIN ENDP
Trang 9
INSO PROC
XOR DX, DX
XOR CX,CX
MOV AX,KQ
CHIA:
DIV CHIA10
PUSH DX
INC CX
XOR DX, DX
CMP AX,0
JNE CHIA
MOV AH, 2
HT:
POP DX ADD DL,30H INT 21H LOOP HT RET INSO ENDP
NHAPSO PROC MOV CX,4 MOV TONG,0 NHAP:
MOV AH,1 INT 21H SUB AL,30H XOR BX,BX MOV BL,AL MOV AX,TONG MUL NHAN10 ADD AX,BX MOV TONG,AX LOOP NHAP RET
NHAPSO ENDP
15 Viết chương trình tính giai thừa n! Với n là số nguyên dương nhập từ bàn phím In kết quả ra màn hình ở dạng thập phân Cho biết, khả năng của 8086 tính được n
lớn nhất là bao nhiêu?
.MODEL SMALL
.STACK 100
.DATA
SO DW 0
NHAN10 DW 10
TB DB "NHAP SO: $"
TINH DW 0
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,9
LEA DX,TB
INT 21H
MOV CX,4
NHAP:
MOV AH,1 INT 21H
AND AL,0FH
XOR BX,BX MOV BL,AL
MOV AX,SO MUL NHAN10 ADD AX,BX
MOV SO,AX LOOP NHAP
MOV CX,SO MOV AX,1
GT:
MUL CX
LOOP GT MOV TINH,AX
MOV AH,4CH
Trang 10INT 21H
MAIN ENDP END MAIN
16 Viết chương trình tính ước số chung lớn nhất của 2 số a và b! Với a, b là số nguyên dương nhập từ bàn phím In kết quả ra màn hình ở dạng thập phân
;CHUA KIEM TRA GIA SU A>B; CHUA KIEM TRA NHAP VAO LA SO 0
.MODEL SMALL
.STACK 100
.DATA
SOA DW 0
SOB DW 0
TB1 DB "NHAP SO
A: $"
TB2 DB 10,13,"NHAP
SO B: $"
TB3 DB
10,13,"USCLN CUA
HAI SO: $"
BIEN DW 0
NHAN10 DW 10
CHIA10 DW 10
TONG DW 0
UOC_CHUNG DW 0
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,9 LEA DX,TB1 INT 21H
CALL NHAPSO
MOV AX,TONG MOV SOA,AX
MOV AH,9 LEA DX,TB2 INT 21H
CALL NHAPSO
MOV AX,TONG MOV SOB,AX
;287/91 du 14
;91/14 du 7
;14/7 du 0
;->>> UCLN=7
XOR BX,BX XOR AX,AX MOV AX,SOA MOV BX,SOB MOV BIEN,BX
UCLN:
XOR DX,DX DIV BIEN MOV AX,BIEN XOR BX,BX MOV BX,BIEN MOV BIEN,DX CMP DX,0 JNE UCLN