Đọc 512 byte (1 sector) từ tệp copy đi để vào vùng nhớ đệm (CN 3f của ngắt int 21h) (AX (chứa số lượng byte thực tế đã đọc) :

Một phần của tài liệu Tuyển tập các bài tập và lời giải về lập trình hệ thống của PGS,TS Đặng Thanh Sơn (Trang 40 - 48)

(AX (chứa số lượng byte thực tế đã đọc) :

• Nếu AX≠0 thì ghi dữ liệu đọc được từ vùng nhớ đệm vào tệp cần copy đến (CN 40h của ngắt int 21h), sau đó quay lại 5. (đọc cá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 6. 6. Đóng 2 tệp (CN 3eh của ngắt int 21h)

Chú ý: Khi thực hiện các chức năng của tệp nếu có lỗi thì hiện thông báo sau đó kết thức, còn

nếu mọi chức năng đều thực hiện tốt thì tiếp tục chương trình cho đến khi kết thúc (về DOS).

Khi chương trình chạy yêu cầu có dạng :

INCLUDE lib1.asm .MODEL small .STACK 100h .DATA

ct1 db 13,10,’ Hay vao ten tep can copy di : $’ ct2 db 13,10,’ Hay vao ten tep can copy den : $’ 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_C db 13,10,’ Khong dong duoc tep !$’ buff db 30 db ? file_name db 30 dup(?) the_tep1 dw ? the_tep2 dw ? dem db 512 dup(?)

tieptuc db 1310,’ Co tiep tuc CT (c/k) ? $’ .CODE PS: mov ax,@data mov ds,ax L_CT0: CLRSCR

HienString ct1 ; Hiện thông báo ct1 lea dx,buff

call GET_FILE_NAME ; Vào tên tệp cần copy đi lea dx,file_name ; Mở tệp đã có để đọc

Hay vao ten tep can copy di : x.txt Hay vao ten tep can copy den: y.txt!

Hiện lỗi khi thực hiện các chức năng nếu có

mov al,0

mov ah,3dh int 21h

jnc L_CT1

HienString Err_O ; Hiện thông báo Err_O nếu mở tệp bị lỗi (CF=1) jmp Exit_CT

L_CT1:

mov the_tep1,ax ; Nếu mở tệp tốt thì đưa thẻ tệp có trong AX -> biến thetep1 HienString ct2

lea dx,buff

call GET_FILE_NAME ; Vào tên tệp cần copy đến lea dx,file_name ; Tạo tệp mới và mở

mov cx,0 ; Không đặt thuộc tính nào cho tệp mov ah,3ch

int 21h jnc L_CT2

HienString Err_O ; Hiện thông báo Err_O nếu tạo và mở tệp bị lỗi (CF=1) jmp DONG_TEP1

L_CT2:

mov the_tep2,ax ; Nếu mở tệp tốt thì đưa thẻ tệp có trong AX -> biến thetep2 L_CT3:

mov bx,the_tep1 ; Đọc 512 byte từ tệp copy đi -> vùng nhớ dem mov cx,512

lea dx,dem mov ah,3fh int 21h jnc L_CT4

HienString Err_R ; Hiện thông báo Err_R nếu đọc tệp bị lỗi (CF=1) jmp DONG_TEP2

L_CT4: (adsbygoogle = window.adsbygoogle || []).push({});

and ax,ax ; Số lượng byte thực tế đã đọc được bằng 0?

jz DONG_TEP1 ; Đúng băng 0 (hết tệp) thì nhảy đến đóng các tệp và kết thúc, mov bx,the_tep2 ; còn không bằng 0 thì tiến hành ghi tệp

mov cx,ax ; Đưa số lượng byte đọc được vào CX lea dx,dem ; Trỏ đến vùng đệm chứa số liệu cần ghi mov ah,40h ; Chức năng ghi tệp

int 21h jnc L_CT5

HienString Err_W ; Hiện thông báo Err_W nếu không ghi được tệp (CF=1), jmp DONG_TEP2

L_CT5:

jmp L_CT4 ; Ghi tệp tốt thì nhảy về tiếp tục đọc và ghi DONG_TEP2:

mov bx,the_tep2 ; Chức năng đóng tệp mov ah,3eh

int 21h

jnc DONG_TEP1

HienString Err_C ; Hiện thông báo Err_C nếu không đóng được tệp (CF=1) DONG_TEP1:

mov bx,the_tep1 ; Chức năng đóng tệp mov ah,3eh

int 21h jnc Exit_CT HienString Err_C Exit_CT:

Hienstring tieptuc ; Hiện thông báo tieptuc mov ah,1 ; Chờ 1 ký tự từ bàn phím int 21h

cmp al,'c' ; Ký tự vào có phải 'c'

jne Thoat_CT ; Không phải 'c' thì nhảy đế Thoat_CT, jmp L_CT0 ; còn đúng là 'c' thì nhảy về L_CT0 Thoat_CT:

mov ah,4ch ; Về DOS int 21h

INCLUDE lib3.asm ; lib3.asm chứa CT con GET_FILE_NAME END PS

Bài 7

Hãy viết chương trình thay cho lệnh type|more của DOS (hiện nội dung tệp dạng ASCII lên màn hình).

Cách giải : Giống bài 6 chỉ khác là thay vì ghi vào tệp cần copy đến thì đưa ra màn hình (ghi tệp với thẻ tệp bằng 1)

1. Vào tên tệp cần hiện (gọi CT con GET_FILE_NAME)

2. Mở tệp đã có để đọc (CN 3dh của ngắt 21h với AL=0 – để đọc)

3. Đọc 512 byte (1 sector) từ tệp copy đi để vào vùng nhớ đệm (CN 3f của ngắt int 21h) (AX (chứa số lượng byte thực tế đã đọc) :

• Nếu AX≠0 thì ghi dữ liệu đọc được từ vùng nhớ đệm vào tệp cần copy đến (CN 40h của ngắt int 21h với BX=1-thẻ tệp), sau đó quay lại 5. (đọc cá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 4. 4. Đóng tệp (CN 3eh của ngắt int 21h)

Chú ý: Khi thực hiện các chức năng của tệp nếu có lỗi thì hiện thông báo sau đó kết thức, còn

nếu mọi chức năng đều thực hiện tốt thì tiếp tục chương trình cho đến khi kết thúc.

INCLUDE lib1.asm .MODEL small .STACK 100h .DATA

hx db 13,10,’ Hay vao ten tep can hien : $’ 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_C db 13,10,’ Khong dong duoc tep !$’ buff db 30 db ? file_name db 30 dup(?) the_tep dw ? dem db 512 dup(?) more db 13,10,’ More …$’ (adsbygoogle = window.adsbygoogle || []).push({});

tieptuc db 1310,’ Co tiep tuc CT (c/k) ? $’ .CODE PS: mov ax,@data mov ds,ax L_CT0: CLRSCR

HienString hx ; Hiện thông báo hx lea dx,buff

call GET_FILE_NAME ; Vào tên tệp cần copy đi lea dx,file_name ; Mở tệp đã có để đọc

mov al,0

mov ah,3dh int 21h

jnc L_CT1 ; Mở tệp tốt (CF=0) thì nhảy,

HienString Err_O ; còn có lỗi (CF=1) thì hiện thông báo Err_O jmp Exit_CT

L_CT1:

mov the_tep,ax ; Nếu mở tệp tốt thì đưa thẻ tệp có trong AX -> biến the_tep L_CT2:

mov bx,the_tep ; Đọc 512 byte từ tệp copy đi -> vùng nhớ dem mov cx,512

Hay vao ten tep can copy di : lib1.asm

Hiện nội dung tệp với chữ More ở cuối nếu chưa quá 25 dòng, nếu ấn phím bất kỳ sẽ hiện tiếp theo cho đến hết

lea dx,dem mov ah,3fh int 21h jnc L_CT3

HienString Err_R ; Hiện thông báo Err_R nếu đọc tệp bị lỗi (CF=1) jmp DONG_TEP

L_CT3:

and ax,ax ; Số lượng byte thực tế đã đọc được bằng 0?

jz DONG_TEP ; Đúng bằng 0 (hết tệp) thì nhảy đến đóng các tệp và kết thúc, mov bx,1 ; còn không bằng 0 thì tiến hành đưa ra màn hình với thẻ têp=1 mov cx,ax ; Đưa số lượng byte đọc được vào CX

lea dx,dem ; Trỏ đến vùng đệm chứa số liệu cần đưa ra màn hình mov ah,40h ; Chức năng hiện (ghi tệp với thẻ tệp bằng 1)

int 21h

jnc L_CT4 ; Ghi tệp tốt nhì nhảy

HienString Err_W ; Hiện thông báo Err_W nếu không ghi được tệp (CF=1), jmp DONG_TEP

L_CT:

HienString more ; Hiện chữ More… lên màn hình mov ah,1 ; Chờ 1 ký tự từ bàn phím

int 21h

jmp L_CT2 ; Nhảy về tiếp tục đọc và hiện DONG_TEP:

mov bx,the_tep ; Chức năng đóng tệp mov ah,3eh

int 21h jnc Exit_CT HienString Err_C Exit_CT:

Hienstring tieptuc ; Hiện thông báo tieptuc mov ah,1 ; Chờ 1 ký tự từ bàn phím int 21h

cmp al,'c' ; Ký tự vào có phải 'c'

jne Thoat_CT ; Không phải 'c' thì nhảy đế Thoat_CT, jmp L_CT0 ; còn đúng là 'c' thì nhảy về L_CT0 Thoat_CT: (adsbygoogle = window.adsbygoogle || []).push({});

mov ah,4ch ; Về DOS int 21h

INCLUDE lib3.asm ; lib3.asm chứa CT con GET_FILE_NAME END PS

Bài 8

Cách giải : Sử dụng chức năng 56h của ngắt int 21h.

Khi chương trình chạy yêu cầu có dạng :

INCLUDE lib1.asm .MODEL small .STACK 100h .DATA

dt1 db 13,10,’ Hay vao ten tep cu : $’ dt2 db 13,10,’ Hay vao ten tep moi : $’ Err_REN db 13,10,’ Khong doi duoc ten tep$’ Suc_REN db 13,10,’ Tep da duoc doi ten$’ buffc db 30 db ? file_namec db 30 dup(?) buffm db 30 db ? file_namem db 30 dup(?)

tieptuc db 1310,’ Co tiep tuc CT (c/k) ? $’ .CODE PS: mov ax,@data mov ds,ax L_REN0: CLRSCR

HienString dt1 ; Hiện thông báo dt1 lea dx,buffc

call GET_FILE_NAME ; Vào tên tệp cần copy đi lea dx,file_namec ; ds:dx <- seg:offset xâu chứa tên tệp cũ HienString dt2 ; Hiện thông báo dt2

lea dx,buffm

call GET_FILE_NAME ; Vào tên tệp cần copy đi lea di,file_namem ; di <- offset xâu chứa tên tệp mới push ds

pop es ; es=ds

mov ah,56h ; Chức năng đổi tên tệp int 21h

jnc L_REN1

HienSString Err_REN ; Hiện thông báo Err_REN khi CF=1 Hay vao ten tep cu : x.txt

Hay vao ten tep moi: y.txt

Tep da duoc doi ten hoặc Khong doi duoc ten tep Co tiep tuc CT (c/k)?

jmp Exit_REN L_REN1:

HienString Suc_REN ; Hiện thông báo Suc_REN khi CF=0 Exit_REN:

Hienstring tieptuc ; Hiện thông báo tieptuc mov ah,1 ; Chờ 1 ký tự từ bàn phím int 21h

cmp al,'c' ; Ký tự vào có phải 'c'

jne Thoat_REN ; Không phải 'c' thì nhảy đế Thoat_REN, jmp L_CT0 ; còn đúng là 'c' thì nhảy về L_REN0 Thoat_REN:

mov ah,4ch ; Về DOS int 21h

INCLUDE lib3.asm ; lib3.asm chứa CT con GET_FILE_NAME END PS

Bài 9

Hãy viết chương trình lấy thuộc tính của tệp. Cách giải :

1. Vào tên tệp cần lấy thuộc tính (gọi CT con GET_FILE_NAME)

2. Sử dụng chức năng lấy thuộc tính của tệp (CN 43h của ngắt int 21h với AL=0 – lấy thuộc tính).

Khi chương trình chạy yêu cầu, ví dụ có dạng : (adsbygoogle = window.adsbygoogle || []).push({});

INCLUDE lib1.asm .MODEL small .STACK 100h .DATA

ltt1 db 13,10,’ Hay vao ten tep can lay thuoc tinh : $’ ltt2 db 13,10,’ Tep co thuoc tinh la : $’

Err_LTT db 13,10,’ Khong lay duoc thuoc tinh$’ buff db 30

db ?

file_name db 30 dup(?)

tt0 db ‘ Khong co thuoc tinh nao $’ tt1 db ‘ Read Only $’

tt2 db ‘ + Hidden $’ tt3 db ‘ + System $’

Hay vao ten tep can lay thuoc tinh : x.txt Tep co thuoc thinh: Read Only

tt4 db ‘ + Archive $’

tieptuc db 1310,’ Co tiep tuc CT (c/k) ? $’ .CODE PS: mov ax,@data mov ds,ax L_LTT0: CLRSCR

HienString ltt1 ; Hiện thông báo ltt1 lea dx,buff

call GET_FILE_NAME ; Vào tên tệp cần lấy thuộc tính mov al,0 ; Chức năng lấy thuộc tính

lea dx,file_name ; Thuộc tính có trong CX (thực chất nằm ở CL) mov ah,43h int 21h jnc L_LTT1 HienString Err_LTT jmp Exit_LTT L_LTT1:

HienString ltt2 ; Hiện thông báo ltt2

and cl,00100111b ; Tách các bit thuộc tính của tệp jnz L_LTT2 ; Có thuộc tính thi nhảy,

HienString tt0 ; còn không thi hiện tt0 jmp Exit_LTT ; và thoát

L_LTT2:

shr cl,1 ; Bit Read Only -> bit cờ CF

jnc L_LTT3 ; CF=0 (không có thuộc tính Read Only) thì nhảy, HienString tt1 ; còn CF=1 (có thuộc tính Read Only) thì hiện tt1 L_LTT3:

shr cl,1 ; Bit Hidden -> bit cờ CF

jnc L_LTT4 ; CF=0 (không có thuộc tính Hidden) thì nhảy, HienString tt2 ; còn CF=1 (có thuộc tính Hidden) thì hiện tt2 L_LTT4:

shr cl,1 ; Bit System -> bit cờ CF

jnc L_LTT5 ; CF=0 (không có thuộc tính System) thì nhảy, HienString tt3 ; còn CF=1 (có thuộc tính System) thì hiện tt3 L_LTT5:

shr cl,1 shr cl,1

shr cl,1 ; Bit Archive -> bit cờ CF

jnc Exit_LTT ; CF=0 (không có thuộc tính Archive) thì nhảy, HienString tt4 ; còn CF=1 (có thuộc tính Archive) thì hiện tt4 Exit_LTT:

Hienstring tieptuc ; Hiện thông báo tieptuc mov ah,1 ; Chờ 1 ký tự từ bàn phím int 21h

cmp al,'c' ; Ký tự vào có phải 'c'

jne Thoat_LTT ; Không phải 'c' thì nhảy đế Thoat_LTT, jmp L_LTT0 ; còn đúng là 'c' thì nhảy về L_LTT0 Thoat_LTT:

mov ah,4ch ; Về DOS int 21h (adsbygoogle = window.adsbygoogle || []).push({});

INCLUDE lib3.asm ; lib3.asm chứa CT con GET_FILE_NAME END PS

Bài 10

Hãy viết chương trình đặt thuộc tính cho tệp tệp. Cách giải :

1. Vào tên tệp cần lấy thuộc tính (gọi CT con GET_FILE_NAME)

2. Sử dụng chức năng đặt thuộc tính cho tệp (CN 43h của ngắt int 21h với AL=1 – lấy thuộc tính) và thuộc tính cần đặt phải nằm trong CX.

Khi chương trình chạy yêu cầu, ví dụ có dạng :

Hay vao ten tep can dat thuoc tinh : x.txt Vao thuoc tinh cho tep: '

Một phần của tài liệu Tuyển tập các bài tập và lời giải về lập trình hệ thống của PGS,TS Đặng Thanh Sơn (Trang 40 - 48)