[Assembly] Viết chương trình gộp 2 tệp

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

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.

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em