.CODE PS: mov ax,@data mov ds,ax L_DTT0: CLRSCR
HienString dtt1 ; Hiện thông báo dtt1 lea dx,buff
call GET_FILE_NAME ; Vào tên tệp cần lấy thuộc tính HienString dtt2 ; Hiện thông báo dtt2
call VAO_SO_N ; Chọn thuộc tính (từ 0 -> 15) mov cx,ax ; Đặt thuộc tính vào CX cmp cx,8
jb L_DTT1 add cx,24 L_DTT1:
lea dx,file_name ; Thuộc tính có trong CX mov al,1 ; Đặt thuộc tính
mov ah,43h int 21h jnc L_DTT2
HienString Err_DTT; Hiện thông báo Err_DTT jmp Exit_DTT
L_DTT2:
HienString Suc_DTT; Hiện thông báo Suc_DTT Exit_DTT:
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_DTT ; Không phải 'c' thì nhảy đế Thoat_DTT, jmp L_DTT0 ; còn đúng là 'c' thì nhảy về L_DTT0 Thoat_DTT:
mov ah,4ch ; Về DOS int 21h
INCLUDE lib2.asm ; lib2.asm chứa CT con VAO_SO_N
INCLUDE lib3.asm ; lib3.asm chứa CT con GET_FILE_NAME END PS
Bài 11
Hãy viết chương trình chia 1 tệp (tệp không quá 64 k) thành 2 tệp bằng nhau Cách giải :
1. Vào tên tệp cần chia (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. Xác định độ dài tệp bằng cách đưa con trỏ tệp về cuối têp thì AX chứa độ dài tệp (CN 42h của ngắt int 21h với AL=2 và khoảng cách nằm trong CX=0 vàDX=0)
4. Trả con trỏ tệp trở lại đầu tệp (CN 42h của ngắt int 21h với AL=0 và khoảng cách nằm trong CX=0 vàDX=0)
5. Đọc toàn bộ tệp để vào vùng đệm (CN 3fh của ngắt int 21h) 6. Vào tên tệp con 1 (gọi CT con GET_FILE_NAME)
7. Tạo tệp mới và mở (CN 3ch của ngắt int 21h)
8. Ghi ½ dữ liệu từ vùng đệm vào tệp con 1 (CN 40h của ngắt int 21h) 9. Vào tên tệp con 2 (gọi CT con GET_FILE_NAME)
10. Tạo tệp mới và mở (CN 3ch của ngắt int 21h)
12. Đóng 3 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ì không hiện gì cả.
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,'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 1310,’ Co tiep tuc CT (c/k) ? $’ .CODE PS: mov ax,@data mov ds,ax L_CT0: clrscr HienString ct1
lea dx,buff ; Vào tên tệp cần chia call GET_FILE_NAME
lea dx,file_name ; Mở tệp đã có để đọc mov al,0
Hay vao ten tep can chia : lib1.asm Hay vao ten tep con 1: x.asm Hay vao ten tep con 2: y.asm
Hiện lỗi khi thực hiện các chức năng nếu có
mov ah,3dh int 21h
jnc L_CT1 ; Mở tệp tốt (CF=0) thì nhảy,
HienString Err_O ; còn mở tệp có lỗi (CF=1) thì hiện Err_O jmp Exit_CT
L_CT1:
mov the_tep,ax ; Cất thẻ tệp có trong AX -> biến the_tep mov bx,ax ; Đưa con trỏ về cuối tệp để xác định độ dài tệp xor cx,cx ; Khoảng cách so sánh là 0
mov dx,cx
mov al,2 ; So với cuối tệp
mov ah,42h ; Chức năng di chuyển con trỏ tệp int 21h
jnc L_CT2 ; Chuyển con trỏ tệp tốt thì nhảy,
HienString Err_S ; còn chuyển có lỗi (CF=1) thì hiện thông báo Err_S jmp DONG_TEP
L_CT2:
mov dodai_tep,ax ; Chuyển về cuối tệp tốt thí AX là độ dài tệp -> viến dodai_tep mov bx,the_tep ; Đưa con trỏ tệp trở về đầu tệp
mov al,0 ; So với đầu tệp
xor cx,cx ; Khoảng cách so sánh là 0 mov dx,cx
mov ah,42h ; Chức năng di chuyển con trỏ tệp int 21h
jnc L_CT3 ; Chuyển con trỏ tệp tốt thì nhảy,
HienString Err_S ; còn chuyển có lỗi (CF=1) thì hiện thông báo Err_S jmp DONG_TEP
L_CT3:
mov bx,the_tep ; Đọc toàn bộ tệp -> vùng đệm mov cx,dodai_tep
lea dx,dem
mov ah,3fh ; Chức năng đọc tệp int 21h
jnc L_CT4 ; Đọc tệp tốt thì nhảy,
HienString Err_R ; còn có lỗi khi đọc tệp (CF=1) thì hiện thông báo Err_R jmp DONG_TEP
L_CT4:
HienString ct2 ; Hiện thông báo ct2 lea dx,buff ; Vào tên tệp con 1 call GET_FILE_NAME
lea dx,file_name ; Chức năng 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_CT5 ; Tạo và mở tệp tốt thì nhảy,
HienString Err_O ; còn có lỗi khi tạo và mở tệp (CF=1) thì hiện thông báo Err_O jmp DONG_TEP
L_CT5:
mov the_tepc1,ax ; Thẻ tệp ở AX -> biến the_tepc1
mov bx,ax ; Ghi ½ dữ liệu từ vùng đệm (chứa dữ liệu đọc được) -> tệp 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 tốt thì nhảy,
HienString Err_W ; còn có lỗi khi ghi tệp (CF=1) thì hiện thông báo Err_W jmp DONG_TEPC1
L_CT6:
HienString ct3 ; Hiện thông báo ct3 lea dx,buff ; Vào tên tệp con 2 call GET_FILE_NAME
lea dx,file_name ; Chức năng 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_CT7 ; Tạo và mở tệp tốt thì nhảy,
HienString Err_O ; còn có lỗi khi ghi tệp (CF=1) thì hiện thông báo Err_O jmp DONG_TEPC1
L_CT7:
mov the_tepc2,ax ; Thẻ tệp ở AX -> biến 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 ; Số lương byte còn lại cho têp con 2 lea dx,dem
add dx,ax ; Trỏ đến đầu vùng nhớ chứa dữ liệu còn lại mov ah,40h
int 21h
jnc DONG_TEPC2 ; Ghi tệp tốt thì nhảy,
HienString Err_W ; còn có lỗi khi ghi tệp (CF=1) thì hiện thông báo Err_W DONG_TEPC2:
mov bx,the_tepc2 ; Đóng tệp con 2 mov ah,3eh
jnc DONG_TEPC1 ; Đóng tệp tốt thì nhảy,
hienString Err_C ; còn có lỗi khi đóng tệp (CF=1) thì hiện thông báo Err_C DONG_TEPC1:
mov bx,the_tepc1 ; Đóng tệp con 1 mov ah,3eh
int 21h
jnc DONG_TEP HienString Err_C DONG_TEP:
mov bx,the_tep ; Đóng tệp cần chia mov ah,3eh
int 21h jnc TIEPTUC 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 12
Hãy viết chương trình đặt lại ngày, tháng và năm (date) và giữ nguyên giờ, phút và giây cho tệp.
Cách giải :
1. Vào tên tệp cần đặt lại ngày, tháng, năm (gọi CT con GET_FILE_NAME) 2. Mở tệp đã có để đọc và ghi (CN 3dh của ngắt 21h với AL=2 – để đọc và ghi) 3. Lấy time và date của tệp (CN 57h của ngắt int 21h với AL=0 – lấy time+date)
4. Cất time để sau này còn hồi phục (đặt lại) và đưa ngày, tháng, năm mới vào và đưa vào vị trí các bit trong format của date
5. Đặt date mới và time cũ cho tệp (CN 57h của ngắt int 21h với AL=1 – đặt time+date) 6. Đóng tệp (CN 3eh của ngắt int 21h)
Khi chương trình chạy yêu cầu có dạng :
Hay vao ten tep can dat lai time : x.txt Vao ngày, thang, nam moi: 03:08:2013 Co tiep tuc CT (c/k)?
INCLUDE lib1.asm .MODEL small .STACK 100h .DATA
dd1 db 13,10,'Vao ten tep can dat lai time : $' dd2 db 13,10,'Vao gio, phut, giay moi : $' hc db ,' : $'
Err_O db 13,10,'Khong mo duoc tep !$'
Err_LT db 13,10,’Khong lay duoc thoi gian cua tep !$’ Err_DD db 13,10,’ Khong dat duoc thoi gian !$’
Err_C db 13,10,’Khong dong duoc tep !$’ the_tep dw ?
buff db 30 db ?
file_name db 30 dup(?)
tieptuc db 1310,’ Co tiep tuc CT (c/k) ? $’ .CODE PS: mov ax,@data mov ds,ax L_DD0: CLRSCR
HienString dd1 ; Hiện thông báo dd1 lea dx,buff ; Vào tên tệp
call GET_FILE_NAME
lea dx,file_name ; Mở tệp đã có mov al,2 ; để đọc và ghi
mov ah,3dh ; Chức năng mở tệp đã có int 21h
jnc L_DD1
HienString Err_O ; Mở tệp có vấn đề thì hiện thông báo sai jmp Exit_DD ; Nhảy về kết thúc chương trình
L_DD1:
mov the_tep,ax ; Cất thẻ tệp vào biến the_tep ; Lấy time và date hiện có của tệp
mov bx,ax ; Đưa thẻ tệp vào thanh ghi BX mov al,0 ; Chức năng lấy time và date của tệp
int 21h ; và DX chứa ngày, tháng và năm jnc L_DD2
HienString Err_LT ; Thông báo sai khi lấy time, date của tệp jmp DONG_TEP
L_DD2:
push cx ; Cất time cũ của tệp để sau còn đặt lại ; Phần vào ngày, tháng và năm mới cho tệp
HienString dd2
xor dx,dx ; dx sẽ chứa ngày, tháng và năm call VAO_2_SO ; Nhận 2 chữ số của ngày xor ah,ah ; ah=0
or dx,ax ; Đưa vào phần ngày của thanh ghi dx HienString hc ; Hiện dấu 2 chấm
call VAO_2_SO ; Nhận 2 chữ số của tháng xor ah,ah
mov cl,5; Số lần dịch trái
shl ax,cl ; Dịch trái 5 lần giá trị tháng
or dx,ax ; Đưa vào phần tháng của thanh ghi dx HienString hc ; Hiện dấu 2 chấm
call VAO_SO_N ; Nhận 4 chữ số của năm sub ax,1980 ; Hiệu chỉnh năm
mov cl,9; Số lần dịch trái
shl ax,cl ; Dịch trái 9 lần
or dx,ax ; Đưa vào phần năm của thanh ghi dx ; Đặt lại time và date của tệp (CN 57h của int 21h với AL=1)
pop cx ; Lấy lại time cũ của tệp mov bx,the_tep ; Thẻ tệp vào bx
mov al,1 ; Set time và date (CN 57h int 21h với
mov ah,57h ; al=1-để đặt, date và time ở dx:cx) int 21h
jnc DONG_TEP
HienString Err_DD ; Thông báo lỗi khi đặt time và date DONG_TEP:
mov bx,the_tep ; Thẻ tệp vào bx mov ah,3eh ; Chức năng đóng tệp int 21h
jnc Exit_DD
HienString Err_C ; Thông báo lỗi khi đóng tệp Exit_DD:
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_DD ; Không phải 'c' thì nhảy đế Thoat_DD, jmp L_DD0 ; còn đúng là 'c' thì nhảy về L_DD0 Thoat_DD:
mov ah,4ch ; Về DOS int 21h ;--- ; Nhận 1 số nguyên có 2 chữ số (phải đánh đủ và đúng) | ;--- VAO_2_SO PROC push bx cx dx mov bl,10 mov ah,1 ; Chờ nhận chữ số hàng chục int 21h
sub al,30h ; Chuyển số dạng ASCII sang dạng số mul bl ; Nhân số hàng chục với 10
mov cl,al; Số hàng chục tạm cất vào cl mov ah,1; Chờ nhận chữ số hàng đơn vị int 21h
sub al,30h ; Chuyển số dạng ASCII sang dạng số add al,cl ; Cộng số hàng đơn vị với hàng chục
pop dx cx bx ret
VAO_2_SO ENDP
INCLUDE lib2.asm ; Chứa chương trình con VAO_SO_N
INCLUDE lib3.asm ; Chứa chương trình con GET_FILE_NAME
END PS
Bài 13
Hãy viết chương trình lấy giờ, phút, giây và % giây của máy tính.
Cách giải : Sử dụng chức năng 2ch của ngắt int 21h (xem chức năng 2ch của ngắt int 21h).
Khi chương trình chạy yêu cầu ví dụ có dạng :
Gio, phut va giay hien tai cua MT la : 10:21:30.35 Co tiep tuc CT (c/k)?
INCLUDE lib1.asm .MODEL small .STACK 100h .DATA
lt1 db 13,10,’Gio, phut, giay và % giay hien tai cua MT la : $' hc db ' : $'
dc db ‘.$’
tieptuc db 13,10,’Co tiep tuc CT (c/k)? $’ .CODE PS: mov ax,@data mov ds,ax L_LT0: clrscr ; Xóa màn hình
HienString lt1 ; Hiện thông báo lt1
mov ah,2ch ; Chức năng lấy giờ, phút và giây của máy tính int 21h
mov al,ch ; Đưa giờ từ ch -> al xor ah,ah ; ah=0
call HIEN_SO_N ; Hiện giờ HienString hc ; Hiện dấu ‘:’ mov al,cl ; Đưa phút từ cl -> al xor ah,ah ; ah=0 call HIEN_SO_N ; Hiện phút HienString hc ; Hiện dấu ‘:’
mov al,dh ; Đưa giây từ dh -> al xor ah,ah ; ah=0
call HIEN_SO_N ; Hiện giây Hienstring dc ; Hiện dấu ‘.’ mov al,dl; Đưa %giây từ dl -> al xor ah,ah ; ah=0
call HIEN_SO_N ; Hiện % giây HienString tieptuc
mov ah,1 ; Chờ ấn 1 phím int 21h cmp al,’c’ jne Thoat_LT jmp L_LT0 Thoat_LT: mov ah,4ch int 21h INCLUDE lib2.asm END PS Bài 14
Hãy viết chương trình lấy ngày, tháng và năm của máy tính.
Cách giải : Giống bài 13 với CN 2ah của ngắt int 21h (xem chức năng 2ah của int 21h).
Bài 15
Hãy viết chương trình đặt lại giờ, phút và giây cho máy tính.
Cách giải : Sử dụng chức năng 2dh của ngắt int 21h (xem chức năng 2dh của int 21h). Chú ý: Bài này chỉ chạy đúng với máy tính được khởi động DOS thật. !!!!!
Khi chương trình chạy yêu cầu ví dụ có dạng :
INCLUDE lib1.asm .MODEL small .STACK 100h .DATA
dt1 db 13,10,’Dat lai gio, phut va giay choMT : $' hc db ' : $'
dc db ‘.$’
tieptuc db 13,10,’Co tiep tuc CT (c/k)? $’ .CODE PS: mov ax,@data mov ds,ax L_DT0: clrscr ; Xóa màn hình
Dat lai gio, phut va giay cho MT : 10:05:30 Co tiep tuc CT (c/k)?
HienString lt1 ; Hiện thông báo dt1 call VAO_2_SO ; Nhận giờ
mov ch,al ; Đưa giờ từ al -> ch HienString hc ; Hiện dấu ‘:’
call VAO_2_SO ; Nhận phút mov cl,al ; Đưa phút từ al -> cl HienString hc ; Hiện dấu ‘:’ call VAO_2_SO ; Nhận giây
mov dh,al ; Đưa gió từ al -> dh HienString dc ; Hiện dấu ‘.’
call VAO_2_SO ; Nhận % giây mov dl,al; Đưa % giây từ al -> dh
mov ah,2dh ; Chức năng đặt giờ, phút, giây và % giây cho máy tính int 21h
HienString tieptuc ; Hiện thông báo tieptuc mov ah,1 ; Chờ ấn 1 phím int 21h cmp al,’c’ jne Thoat_DT jmp L_DT0 Thoat_DT: mov ah,4ch int 21h VAO_2_SO PROC push bx cx dx mov bl,10 mov ah,1 ; Chờ nhận chữ số hàng chục int 21h
sub al,30h ; Chuyển số dạng ASCII sang dạng số mul bl ; Nhân số hàng chục với 10
mov cl,al; Số hàng chục tạm cất vào cl mov ah,1; Chờ nhận chữ số hàng đơn vị int 21h
sub al,30h ; Chuyển số dạng ASCII sang dạng số add al,cl ; Cộng số hàng đơn vị với hàng chục
ret
VAO_2_SO ENDP END PS
Bài 16
Hãy viết chương trình đặt lại ngày, tháng và năm cho máy tính.
Cách giải : Giống bải 15 với CN 2bh của ngắt int 21h (xem chức năng 2bh của int 21h). Vào ngày, tháng bằng CT con VAO_2_SO, còn vào năm bằng CT con VAO_SO_N Chú ý: Bài này chỉ chạy đúng với máy tính được khởi động DOS thật. !!!!!