Tieptuc db 1310,’ Co tieptuc CT (c/k)? $’ CODE

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 49 - 61)

.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 (adsbygoogle = window.adsbygoogle || []).push({});

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, (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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: (adsbygoogle = window.adsbygoogle || []).push({});

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. (adsbygoogle = window.adsbygoogle || []).push({});

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. !!!!!

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 49 - 61)