Chia sẻ code và thuật toán của chương trình gộp 2 tệp assembly.
Xem thêm:
- Liệu máy tính có cổng máy in nối tiếp không?
- Floating Point Unit là gì? chương trình kiểm tra FPU bằng ngôn ngữ lập trình assembly
1. Mô tả bài toán
Viết một chương trình trong ngôn ngữ lập trình assembly để gộp 2 tệp với nhau.
Quy trình bao gồm:
- Lấy tên của tệp nguồn và tệp đích sử dụng chương trình con “GET FILE NAME”.
- Mở tệp nguồn để đọc và tệp đích để ghi, sử dụng các chức năng hệ thống tương ứng.
- Đọc từng sector (512 byte) từ tệp nguồn và ghi vào tệp đích cho đến khi đọc hết tệp nguồn.
- Đóng cả hai tệp sau khi hoàn thành quá trình sao chép.
2. Thuật toán
1. Vào tệp cần copy đi (gọi chương trình con GET FILE NAME)
2. Mở tệp đã có để đọc (chức năng 3dh của ngắt int 21h với al=0 để đọc)
3. Vào tên tệp cần copy đến (gọi CT con của GET FILE NAME)
4. Mở tệp đã có để đọc (chức năng 3dh của ngắt int 21h với al=1 để đọc)
5. Đọc 512 byte (1 sector) từ tệp copy đi để vào vùng nhớ đệm chức năng 3fh của ngắt int 21h. AX chứa số lượng byte thực tế đã đọc:
– Nếu AX khác 0 thì ghi dữ liệu đọc được từ vùng nhớ đệm vào tệp cần copy đến (chức năng 40h của ngắt int 21h) sau đó quay lại bước 4. Đọc 512 byte tiếp theo của tệp copy đi.
– Nếu AX = 0 hết tệp thì nhảy đến bước 5.
6. Đóng 2 tệp (Chức năng 3eh của ngắt int 21h)
3. Code tham khảo
INCLUDE lib1.asm .MODEL small .DATA m1 db 13,10,' CHUC NANG GOP TEP' db 13,10,' -------oOO-------' db 13,10,' (Gop tep thu nhat vao tep thu hai)' db 13,10,13,10,' Vao ten tep thu nhat: $' m2 db 13,10,' Vao ten tep thu hai: $' Err_O db 13,10,' Khong mo duoc tep!$' Err_S db 13,10,' Khong chuyen duoc con tro tep!$' Err_R db 13,10,' Khong doc duoc tep!$' Err_W db 13,10,' Khong ghi duoc tep!$' Err_C db 13,10,' Khong dong duoc tep!$' theteps dw ? thetepd dw ? buff db 30 db ? file_name db 30 dup(?) dem db 512 dup(?) tieptuc db 13,10,' Co tiep tuc chuong trinh (c/k)?$' success_msg db 13,10,' Da gop tep thanh cong!$' ; Thong bao thanh cong .CODE PS: mov ax, @data mov ds, ax L0: clrscr HienString m1 ; Hien thong bao chuong trinh lea dx,buff call GET_FILE_NAME ; Vao tep can duoc gop vao tep sau lea dx,file_name ; DX tro den dau ten tep mov al,0 ; De doc mov ah,3dh ; Chuc nang mo tep da co de doc int 21h jnc L1 ; CF=0 (mo tot) thi nhay den L1, HienString Err_O ; con CF=1 (mo khong duoc) thi hien thong bao Err_O jmp KT ; roi nhay ve KT L1: mov theteps,ax ; Neu mo duoc tep thi dua the tep co trong AX vao bien theteps HienString m2 ; Hien thong bao m2 lea dx,buff ; DX tro den buff call GET_FILE_NAME ; Vao ten tep can copy den lea dx,file_name ; Tao tep moi va mo mov al,1 ; De ghi mov ah,3dh ; Chuc nang mo tep da co int 21h jnc L2 ; CF=0 (mo tot) thi nhay den L2, HienString Err_O ; con CF=1 (khong mo duoc) thi hien thong bao Err_O jmp DONGTEPS ; roi nhay den DONGTEPS L2: mov thetepd,ax ; Neu mo tep tot thi dua the tep co trong AX vao bien thetepd ; Chuyen con tro tep ve cuoi tep se duoc gop vao mov bx,ax ; BX=thetepd mov al,2 ; Moc so sanh la cuoi tep xor cx,cx ; Khoang cach so sanh=0 mov dx,cx mov ah,42h ; Chuc nang chuyen con tro tep int 21h jnc L3 ; CF=0 (chuyen tot) thi nhay den L3, HienString Err_S ; con CF=1 (khong chuyen duoc) thi thong bao loi jmp DONGTEPS ; Doc 512 byte cua tep can gop vao tep dich vao vung dem L3: mov bx,theteps ; BX = the tep can doc mov cx,512 ; So byte can doc lea dx,dem ; DX tro den dau vung dem se chua cac byte doc mov ah,3fh ; Chuc nang doc tep int 21h jnc L4 ; CF=0 (doc tot) thi nhay den L4, HienString Err_R ; con CF=1 thi hien thong bao Err_R jmp DONGTEPD ; roi hay den DONGTEPD L4: and ax,ax ; Xem xet so luong byte thuc te da doc duoc jz DONGTEPD ; Neu AX=0 (so luong byte thuc te da doc=0) thi dong cac tep va ket thuc mov bx,thetepd ; nguoc lai AX#0 thi tien hanh ghi vao cuoi tep dich mov cx,ax ; Dua so luong byte da doc duoc vao cx lea dx, dem ; DX tro den dau vung dem chua du lieu ghi vao tep mov ah,40h ; Chuc nang ghi tep int 21h jnc L5 ; CF=0 (ghi tot) thi nhay den L5, HienString Err_W ; con CF=1 (khong ghi duoc) thi hien thong bao Err_W jmp DONGTEPD ; roi nhay den DONGTEPD L5: HienString success_msg ; Thong bao gop tep thanh cong jmp L3 ; Nhay ve L3 de tiep tuc doc tep DONGTEPD: mov bx,thetepd ; BX=the tep dich mov ah,3eh ; Chuc nang dong tep int 21h jnc DONGTEPS ; CF=0 (dong tep dich tot) thi nhay den DONGTEPS HienString Err_C ; CF=1 (loi khi dong tep) thi hien thoong bao Err_C DONGTEPS: mov bx,theteps ; BX=the tep nguon mov ah,3eh ; Chuc nang dong tep int 21h jnc KT ; CF=0 (dong tot) thi nhay den KT, HienString Err_C ; con CF=1 (khong dong duoc) thi hien Err_C KT: HienString tieptuc ; Hien thong bao tiep tuc mov ah,1 ; Cho mot ky tu nhap tu ban phim int 21h cmp al,'c' ; Ky tu co phai 'c' jne Thoat ; Khong phai 'c' thi nhay den Thoat jmp L0 ; Con dung la c thi nhay den L0 Thoat: mov ah, 4ch int 21h INCLUDE lib4.asm ; lib4 chua ct con GET_FILE_NAME END PS
Trên đây là chương trình gộp 2 tệp với nhau assembly. Cảm ơn bạn đã tham khảo trên ttnguyen.net.