Chia sẻ code và thuật toán của chương trình gộp 2 tệp assembly.
Xem thêm:
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
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!$'
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
HienString m1 ; Hien thong bao chuong trinh
call GET_FILE_NAME ; Vao tep can duoc gop vao tep sau
lea dx,file_name ; DX tro den dau ten tep
mov ah,3dh ; Chuc nang mo tep da co de doc
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
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 ah,3dh ; Chuc nang mo tep da co
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
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 al,2 ; Moc so sanh la cuoi tep
xor cx,cx ; Khoang cach so sanh=0
mov ah,42h ; Chuc nang chuyen con tro tep
jnc L3 ; CF=0 (chuyen tot) thi nhay den L3,
HienString Err_S ; con CF=1 (khong chuyen duoc) thi thong bao loi
; Doc 512 byte cua tep can gop vao tep dich vao vung dem
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
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
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
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
HienString success_msg ; Thong bao gop tep thanh cong
jmp L3 ; Nhay ve L3 de tiep tuc doc tep
mov bx,thetepd ; BX=the tep dich
mov ah,3eh ; Chuc nang dong tep
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
mov bx,theteps ; BX=the tep nguon
mov ah,3eh ; Chuc nang dong tep
jnc KT ; CF=0 (dong tot) thi nhay den KT,
HienString Err_C ; con CF=1 (khong dong duoc) thi hien Err_C
HienString tieptuc ; Hien thong bao tiep tuc
mov ah,1 ; Cho mot ky tu nhap tu ban phim
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
INCLUDE lib4.asm ; lib4 chua ct con GET_FILE_NAME
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
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.