Ngôn ngữ lập trình assembly được sử dụng trong nhiều lĩnh vực, bao gồm: ● Hệ điều hành: Một số phần cốt lõi của hệ điều hành được viết bằng assembly để đảm bảo hiệu suất tối ưu.. Thoát k
Trang 1TRƯỜNG ĐẠI HỌC MỞ HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
-BÁO CÁO BÀI TẬP LỚN
Môn: Lập trình hệ thống
Đề tài số 7
Hãy viết chương trình thực hiện 4 chức năng :
1 Chia đôi 1 tệp thành 2 tệp bằng nhau
2 So sánh 2 số nguyên và hiện số bé
3 Liệu máy tính có cổng joystick ?
4 Thoát khỏi chương trình
Hà Nội – 2024
Giảng Viên Hướng Dẫn: Đặng Thành Phu
Sinh Viên Thực Hiện : Nguyễn Thị Mỹ Duyên- 1910A01 Nguyễn Thị Ngọc Minh - 2010A05
Trang 2
MỤC LỤC
1 MỞ ĐẦU 3
2 ĐỀ TÀI 4
3 MÔ TẢ BÀI TẬP LỚN 5
3.1 Chương trình chính C++ 5
3.2 Chương trình chia đôi 1 tệp thành 2 tệp bằng nhau 6
3.3 So sánh 2 số nguyên và hiện số bé 7
3.4.Liệu máy tính có cổng Joystick hay không 8
4 LẬP TRÌNH - CÀI ĐẶT 8
4.1 Chương trình chính 8
4.2 Chương trình chia đôi 1 tệp thành 2 tệp bằng nhau 10
4.3 Chương trình so sánh 2 số nguyên và hiện số nguyên bé 15
4.4 Chương trình kiểm tra máy tính có cổng Joystick hay không 16
4.5 Chương trình thoát khỏi chương trình 17
5 DEMO TOÀN BỘ CHƯƠNG TRÌNH 17
5.1 Chương trình chính 17
5.2 Chương trình đặt ngày, tháng, năm cho hệ thống 18
5.3 Chương trình chia đôi 1 tệp thành 2 tệp bằng nhau 18
5.4 Chương trình so sánh 2 số nguyên và hiện số nguyên bé 18
5.5 Liệu máy tính có cổng Joystick không 19
6 TÀI LIỆU THAM KHẢO 19
Trang 31 MỞ ĐẦU
Ngôn ngữ lập trình assembly là một phần quan trọng của lĩnh vực lập trình hệ thống và máy tính Nó cung cấp một giao diện trực tiếp với phần cứng máy tính, cho phép lập trình viên tương tác với và kiểm soát các tài nguyên phần cứng một cách chi tiết
● Gần gũi với ngôn ngữ máy: Assembly được viết bằng ngôn ngữ máy, gần gũi với ngôn ngữ bin (binary) của máy tính Mỗi lệnh assembly tương ứng với một lệnh máy cụ thể
● Tối ưu hóa hiệu suất: Lập trình assembly cho phép tối ưu hóa hiệu suất ứng dụng vì bạn có kiểm soát trực tiếp trên cách mã máy hoạt động
● Quản lý bộ nhớ: Bạn phải quản lý bộ nhớ thủ công trong assembly, điều này cung cấp kiến thức sâu về cách máy tính quản lý bộ nhớ
● Làm việc gần với phần cứng: Assembly cho phép truy cập trực tiếp vào các thiết bị và giao tiếp với phần cứng máy tính Ngôn ngữ lập trình assembly được sử dụng trong nhiều lĩnh vực, bao gồm:
● Hệ điều hành: Một số phần cốt lõi của hệ điều hành được viết bằng assembly để đảm bảo hiệu suất tối ưu
● Trình điều khiển thiết bị: Assembly được sử dụng để viết các trình điều khiển cho các thiết bị phần cứng
● Lập trình nhúng: Trong các ứng dụng nhúng, assembly là lựa chọn phổ biến để kiểm soát phần cứng
Ngôn ngữ lập trình assembly là một công cụ mạnh mẽ trong lập trình hệ thống và là cầu nối giữa lập trình viên và phần cứng máy tính Hiểu biết
về assembly mang lại sự hiểu rõ sâu sắc về cách máy tính hoạt động và cung cấp khả năng tối ưu hóa hiệu suất trong việc phát triển ứng dụng
Trang 42 ĐỀ TÀI
CÂU 7
Hãy viết chương trình thực hiện 4 chức năng :
1 Chia đôi 1 tệp thành 2 tệp bằng nhau
2 So sánh 2 số nguyên và hiện số bé
3 Liệu máy tính có cổng joystick ?
4 Thoát khỏi chương trình
Ví dụ khi CT chạy :
Trang 53 MÔ TẢ BÀI TẬP LỚN
3.1 Chương trình chính C++
Cần khai báo extern các nhãn dùng chung là tên các chương trình con bao gồm: NTN, SLPTL và DCCOM2
Chương trình C++ sẽ hiện màn hình giới thiệu thông tin tên của bài tập lớn
Sau đó khi ấn ‘c’ thì hiện ra màn hình chứa menu các chức năng của bài tập lớn Màn hình sẽ có nội dung như ảnh sau :
Trang 6Tại đây, sẽ thấy danh sách các chức năng chính của chương trình bao gồm:
1 Chia đôi 1 tệp thành 2 tệp bằng nhau
2 So sánh 2 số nguyên và hiện số bé
3 Liệu máy tính có cổng Joystick
4 Thoát khỏi chương trình
Muốn sử dụng chức năng nào thì chỉ cần nhấn phím số tương ứng của chức năng đó Nếu bạn lỡ nhấn sai các giá trị của các phím từ 1 đến 4 sẽ có thông báo ‘Vao sai roi, nhap lai nhe!’
Nhấn phím 4 để thoát khỏi chương trình Ngược lại nếu chọn các phím chức năng từ 1 đến 3, chương trình C++ sẽ gọi chương trình con tương ứng do tệp ASM viết Khi hoàn thành xong chương trình con, sẽ ấn phím bất kỳ để thoát chương trình con và trở về MENU lựa chọn chính
3.2 Chương trình chia đôi 1 tệp thành 2 tệp bằng nhau
❖ Chức năng: chia đôi tệp thành 2 tệp bằng nhau
❖ Cách làm:
- Định nghĩa hai macro: HienString để hiển thị một chuỗi ký tự và
CLRSCR để xóa màn hình.
Trang 7- Sử dụng các hàm hệ thống DOS để thực hiện các hoạt động như mở, đọc, ghi và đóng tệp
- Chương trình yêu cầu người dùng nhập tên của tệp cần chia
- Sau khi nhập tên tệp, thì mở tệp và đọc toàn bộ nội dung vào bộ đệm
- Sau đó, tạo hai tệp mới và ghi nửa đầu tiên của dữ liệu vào tệp thứ nhất
và nửa còn lại vào tệp thứ hai
- Cuối cùng, yêu cầu người dùng có muốn tiếp tục chương trình hay không
❖ Chương trình con sử dụng:
o HienString: Hiện thông báo
o call GET_FILE_NAME: Vào tên tệp
3.3 So sánh 2 số nguyên và hiện số bé
❖ Chức năng: Chương trình so sánh 2 số nguyên mà người dùng nhập từ bàn phím Sau đó hiển thị số nhỏ hơn trên màn hình và hỏi người dùng có muốn tiếp tục không Nếu có thì lặp lại quá trình, nếu không thì chương trình kết thúc
❖ Cách làm:
- Chương trình bắt đầu bằng việc xóa màn hình để làm sạch màn hình terminal
- Sau đó, hiển thị thông điệp yêu cầu người dùng nhập số thứ nhất từ bàn phím
- Tiếp theo, lấy giá trị số thứ nhất từ người dùng bằng cách gọi procedure
VAO_SO_N từ một tệp mã nguồn khác.
- Giá trị số thứ nhất sau đó được lưu vào thanh ghi BX để so sánh
- Tiếp theo, chương trình hiển thị thông điệp yêu cầu nhập số thứ hai từ người dùng
- Lấy giá trị số thứ hai từ người dùng cũng bằng cách gọi procedure
VAO_SO_N.
- Hai số được so sánh và chương trình giữ nguyên nếu số thứ hai nhỏ hơn
số thứ nhất; nếu không, nó hoán đổi giá trị của hai số để số nhỏ hơn được lưu vào thanh ghi AX
- Sau đó, chương trình hiển thị số nhỏ hơn trên màn hình
- Tiếp theo, hiển thị thông điệp hỏi người dùng có muốn tiếp tục không
- Chương trình chờ người dùng nhập một ký tự từ bàn phím để quyết định tiếp tục hay kết thúc
Trang 8- Nếu người dùng chọn tiếp tục bằng cách nhập 'c', chương trình quay lại bước đầu tiên; nếu không, chương trình kết thúc
❖ Chương trình con sử dụng :
VAO_SO_N : vào số thứ 1
VAO_SO_N : Vào số thứ 2
3.4.Liệu máy tính có cổng Joystick hay không
❖ Chức năng: kiểm tra máy tính có cổng Joystick hay không và hiển thị kết quả tương ứng
❖ Cách làm:
- Sử dụng một hàm hoặc macro để xóa màn hình
- Sử dụng một hàm hoặc macro để hiển thị các thông điệp yêu cầu người dùng
- Sử dụng một ngắt hệ thống phù hợp (trong đoạn mã đã cung cấp, ngắt
int 11h được sử dụng).
- Lưu kết quả kiểm tra được trả về trong thanh ghi AH.
- Xác định trạng thái của cổng joystick dựa trên kết quả được lưu trong
thanh ghi AH.
- Trong đoạn mã đã được cung cấp, bit thứ 5 của thanh ghi AH được sử
dụng để xác định trạng thái của cổng joystick Nếu bit này được set, tức
là CF=1, máy tính không có cổng joystick; nếu không, máy tính có
cổng joystick
- Dựa vào kết quả kiểm tra, hiển thị thông điệp tương ứng cho người dùng
- Hiển thị thông điệp yêu cầu người dùng nhấn một phím bất kỳ để tiếp tục
- Chờ người dùng nhập một phím và kết thúc chương trình
❖ Chương trình con sử dụng:
o HienString: hiện thông báo
4 LẬP TRÌNH - CÀI ĐẶT
4.1 Chương trình chính
#include <iostream.h>
#include <conio.h>
Trang 9extern CHIADOITEP();
extern int SOSANH2SO();
extern CONGJOYSTICK();
extern VEDOS();
void main()
{
char tl;
int cn; /*chuc nang*/
clrscr();
cout<<"\n Truong Dai hoc Mo Ha Noi";
cout<<"\n KHOA CONG NGHE THONG TIN";
cout<<"\n -o0o -";
cout<<"\n\n\n BAI TAP LON MON LTHT";
cout<<"\n\n\n Cac SV thuc hien:";
cout<<"\n 1 NGUYEN THI MY DUYEN Lop: 1910a01"; cout<<"\n 2 NGUYEN THI NGOC MINH Lop: 2010A05";
cout<<"\n\n\n Co tiep tuc CT (c/k)?";
tl=getch();
if(tl=='c')
{
L1:
clrscr();
cout<<"\n CAC CHUC NANG CUA BTL";
cout<<"\n -*** -";
cout<<"\n\n 1 Chia doi 1 tep thanh 2 tep bang nhau ";
cout<< "\n 2 So sanh 2 so nguyen va hien so be";
cout<< "\n 3 Lieu MT co cong Joystick";
cout<< "\n 4 Ve DOS";
cout<< "\n\n Hay chon: ";
cin>>cn;
switch(cn)
{
case 1: CHIADOITEP() ; break;
case 2: SOSANH2SO(); break;
case 3: CONGJOYSTICK(); break;
case 4: VEDOS(); break;
Trang 10default:cout<<"\n Vao sai roi! Vui long chon lai";
}
cout<<"\n Co thuc hien CN khac(c/k): ";
tl=getch();
if(tl=='c') goto L1;
}
}
4.2 Chương trình chia đôi 1 tệp thành 2 tệp bằng nhau
; KET THUC BANG '$' RA MAN HINH |
; -HienString MACRO xau
push AX DX
mov DX,offset xau ; DX tro den dau xau
mov AH,9 ; Chuc nang hien 1 xau ky tu
int 21h ; (ket thuc bang '$') len man hinh
pop DX AX
ENDM
; -; MACRO XOA MAN HINH |
; -CLRSCR MACRO
push AX
mov AH,0fh ; Chuc nang lay mode man hinh hien thoi
int 10h ; va so mode nam o AL
mov AH,0 ; Chuc nang dat mode cho man hinh
int 10h ; so mode can dat nam o AL
pop AX
ENDM
; -INCLUDE lib1.asm
.MODEL small
.STACK 100h
Trang 11ct1 db 13,10,'Vao ten tep can chia : $'
ct2 db 13,10,'Vao ten tep con 1 : $'
ct3 db 13,10,'Vao ten tep con 2 : $'
Err_O db 13,10,'Khong mo duoc tep !$'
Err_R db 13,10,'Khong doc duoc tep !$'
Err_W db 13,10,'Khong ghi duoc tep !$'
Err_S db 13,10,'Khong di chuyen duoc con reo tep !$'
Err_C db 13,10,'Khong dong duoc tep !$'
the_tep dw ?
the_tepc1 dw ?
the_tepc2 dw ?
buff db 30
db ?
file_name db 30 dup(?)
dodai_tep dw ?
dem db 20000 dup(?)
tieptuc db 13,10,' Co tiep tuc CT (c/k) ? $'
.CODE
PUBLIC @CHIADOITEP$qv
@CHIADOITEP$qv PROC
L_CT0:
clrscr
HienString ct1
lea dx,buff ; Vao ten tep can chia
call GET_FILE_NAME
lea dx,file_name ; Mo tep da co de doc
mov al,0
mov ah,3dh
int 21h
jnc L_CT1 ; Mo tep tot(cf=0) thi nhay
HienString Err_O ; con mo tep co loi (CF=1) thi hien Err_O
jmp Exit_CT
L_CT1:
mov the_tep,ax ; Cat the tep co trong AX > bien the tep
mov bx,ax ; dua con tro ve cuoi tep de xac dinh do dai tep
Trang 12xor cx,cx ; khoang cach so sanh la 0
mov dx,cx
mov al,2 ; So voi cuoi tep
mov ah,42h ; Chuc nang di chuyen con tro tep
int 21h
jnc L_CT2 ; Chuyen con tro tep tot thi nhay
HienString Err_S ; con chuyen co loi (CF=1)thi hien thong bao Err_S jmp DONG_TEP
L_CT2:
mov dodai_tep,ax ; Chuyen ve cuoi tep tot thi ax la do dai tep -> bien dodai_tep
mov bx,the_tep ; dua con tro tep tro ve dau tep
mov al,0 ; So voi dau tep
xor cx,cx ; Khoang cach so sanh la 0
mov dx,cx
mov ah,42h ; Chuc nang di chuyen con tro tep
int 21h
jnc L_CT3 ; Chuyen con tro tep tot thi nhay
HienString Err_S ; con chuyen co loi(cf=1) thi hien thong bao Err_S jmp DONG_TEP
L_CT3:
mov bx,the_tep ; doc toan bo tep -> vung dem
mov cx,dodai_tep
lea dx,dem
mov ah,3fh ; Chuc nang doc tep
int 21h
jnc L_CT4 ; doc tep tot thi nhay
HienString Err_R ; con loi khi doc tep thi hien thong bao Err_R
jmp DONG_TEP
L_CT4:
HienString ct2 ; Hien thong bao ct2
lea dx,buff ; vao ten tep con 1
call GET_FILE_NAME
lea dx,file_name ; Chuc nang tao tep moi va mo
mov cx,0 ; Khong dat thuoc tinh nao cho tep
mov ah,3ch
Trang 13int 21h
jnc L_CT5 ; Tao va mo tep tot thi nhay
HienString Err_O ; con co loi khi tao va mo tep thi hien thong bao Err_O
jmp DONG_TEP
L_CT5:
mov the_tepc1,ax ;the tep o AX-> bien the_tep 1
mov bx,ax ; Ghi 1/2 du lieu tu vung dem -> tep con 1
mov cx,dodai_tep
shr cx,1 ; 1/2 do dai tep
lea dx,dem
mov ah,40h
int 21h
jnc L_CT6 ; Ghi tot thi nhay
HienString Err_W ; con co loi khi ghi tep thi hien thong bao Err_W jmp DONG_TEPC1
L_CT6:
HienString ct3 ; Hien thong bao ct3
lea dx,buff ; Vao ten tep con 2
call GET_FILE_NAME
lea dx,file_name ; Chuc nang tao tep moi va mo
mov cx,0 ; Khong dat thuoc tinh cho tep
mov ah,3ch
int 21h
jnc L_CT7 ; Tao va mo tep tot thi nhay
HienString Err_O ; con co loi khi ghi tep thi hien thong bAO Err_O jmp DONG_TEPC1
L_CT7:
mov the_tepc2,ax ; The tep AX -> bien the_tepc2
mov bx,ax ; Ghi 1/2 du lieu con lai tu dem vao tep con 2
mov cx,dodai_tep
mov ax,cx
shr ax,1
sub cx,ax ; so luong byte con lai cho tep con 2
lea dx,dem
add dx,ax ; Tro den dau vung nho chua du lieu con lai
Trang 14mov ah,40h
int 21h
jnc DONG_TEPC2 ; Ghi tep tot thi nhay
HienString Err_W ; con co loi khi ghi tep thi hien thong bao Err_W DONG_TEPC2:
mov bx,the_tepc2 ; dong tep con 2
mov ah,3eh
int 21h
jnc DONG_TEPC1 ; dong tep tot thi nhay
HienString Err_C ; con co loi khi dong tep thi hien thong bao Err_C DONG_TEPC1:
mov bx,the_tepc1 ; dong tep con 1
mov ah,3eh
int 21h
jnc DONG_TEP
HienString Err_C
DONG_TEP:
mov bx,the_tep ; dong tep can chia
mov ah,3eh
int 21h
jnc Exit_CT
HienString Err_C
Exit_CT:
HienString tieptuc ; Hien thong bao tieptuc
mov ah,1 ; Cho 1 ki tu tu ban phim
int 21h
cmp al,'c' ; ky tu vao co phai 'c'
jne Thoat_CT ; Khong phai 'c' thi nhay de Thoat_CT,
jmp L_CT0 ; con dung la 'c' thi nhay ve L_CT0
Thoat_CT:
ret
@CHIADOITEP$qv ENDP
INCLUDE lib3.asm ; lib3.asm chua CT con GET_FILE_NAME
END
Trang 154.3.Chương trình so sánh 2 số nguyên và hiện số nguyên bé
include lib1.asm
.MODEL small
.DATA
M1 db 13,10,' CHUC NANG SO SANH HAI SO NGUYEN '
db 13,10,' -*** -'
db 13,10,13,10,' Hay vao so thu nhat: $'
M2 db 13,10,' Hay vao so thu hai: $ '
M3 db 13,10,' So be la: $'
M4 db 13,10,' Co tiep tuc CT (c/k)?: $'
.CODE
PUBLIC @SOSANH2SO$qv
@SOSANH2SO$qv PROC
L0:
clrscr ; Xoa man hinh
HienString M1 ; Hien thong bao M1
call VAO_SO_N ; Vao so thu 1
mov bx,ax ; BX chua gia tri so thu 1
HienString M2 ; Hien thong bao M2
call VAO_SO_N ; Vao so thu 2 (AX chua gia tri so thu 2)
HienString M3 ; Hien thong bao M3
cmp ax,bx ; So sanh 2 so (o AX va BX)
jl L1 ; Neu AX < BX thi nhay den L1 (giu nguyen),
xchg ax,bx ; con AX > hoac = BX thi doi cheo de luc nao AX cung chua so be
L1:
call HIEN_SO_N ; Hien so be
HienString M4 ; Hien thong bao M4
mov ah,1 ; Cho nhan 1 ky tu tu ban phim
int 21h
cmp al,'c' ; Lieu ky tu vao la 'c'
jne Thoat ; Ky tu vao khong phai la 'c' thi nhay ve Thoat,
jmp L0 ; con ky tu vao la 'c' thi quay ve L0
Thoat:
ret
@SOSANH2SO$qv ENDP