Bài 1
Hãy viết chương trình cho biết máy tính bạn đang dùng có ổ mềm nào hay không? Nếu có thì bao nhiêu ổ?
Cách giải : Chú ý byte của có địa chỉ 0:410h của vùng dữ liệu ROM BIOS có chứa các thông tin liên quan đến thông tin về ổ đĩa mềm, cụ thể như sau :
x x x
Khi chương trình chạy yêu cầu có dạng :
INCLUDE lib1.asm .MODEL small .STACK 100h .DATA
M1 db ’May tinh dang dung co o mem không ? $’ co db ‘Co $’
khong db ‘ Khong $’
M2 db 13,10,’So luong o mem ma may tinh co la : $’ .CODE
PS:
mov ax,@data mov ds,ax CLRSCR
HienString M1 ; Hiện thông báo (‘May tinh dang dung co o mem khong ?’) int 11h ; Ngắt hệ thống thực hiện việc đưa nội dung ô nhớ 0:410h -> al shr al,1 ; Đưa bit thấp nhất vào bit cờ Carry
jc L1 ; Nếu bit cờ Carry=1 thì nhảy đến L1 HienString khong ; còn khômg thì hiện thông báo ‘Khong’ jmp Exit ; Nhảy đến nhãn Exit
L1:
HienString co ; Hiện thông báo ‘Co’
HienString M2 ; Hiện thông báo ‘So luong o mem ma may tinh co la : ‘ mov cl,5 ; Chuyển 2 bit (số lượng ổ mềm -1) sang phải 5 lần shr al,cl
inc al ; al = số lượng ổ mềm
add al,30h ; al là mã ASCII số lượng ổ mềm
1… có ổ mềm 0… không có ổ mềm số lượng ổ mềm -1
May tinh dang dung co o mem khong ? Co
mov ah,0eh ; Chức năng hiện 1 ký tự ASCII lên màn hình int 10h
Exit:
mov ah,1 ; Chờ 1 ký tự từ bàn phím int 21h
mov ah,4ch ; Về DOS int 21h
END PS
Bài 2
Hãy viết chương trình cho biết máy tính bạn đang dùng có cổng COM nào hay không? Nếu có thì bao nhiêu cổng và cho biết địa chỉ các cổng đó (địa chỉ cổng phải là HEXA). Cách giải : Chú ý byte của có địa chỉ 0:411h của vùng dữ liệu ROM BIOS có chứa các thông tin liên quan đến thông tin về số lượng cổng COM mà máy tính đang dùng có, cụ thể như sau:
x x x
Chú ý : Địa chỉ COM1 có trong 2 byte có địa chỉ 0:400h và 0:401h
Địa chỉ COM2 có trong 2 byte có địa chỉ 0:402h và 0:403h ….
Khi chương trình chạy yêu cầu có dạng :
INCLUDE lib1.asm .MODEL small .STACK 100h .DATA
M1 db ’May tinh dang dung co cong COM không ? $’ co db ‘Co $’
khong db ‘ Khong $’
M2 db 13,10,’So luong cong COM ma may tinh co la : $’ M4 db 13,10,’Dia chi cac cong COM la : $’
space db ‘ $’ .CODE PS: 0 0 0… không có cổng COM 0 0 1… có 1 cổng COM 0 1 0. .. có 2 cổng COM 0 1 1… có 3 cổng COM . . .
May tinh dang dung co cong COM khong ? Co
So luong cong COM la : 2
mov ax,@data mov ds,ax CLRSCR
HienString M1 ; Hiện thông báo ‘May tinh dang dung co cong COM khong ?’ int 11h ; Ngắt hệ thống thực hiện việc đưa nội dung ô nhớ 0:411h -> ah mov al,ah ; Đưa nội dung 0:411h -> al
and al,00001110b ; Tách 3 bit chứa số lượng cổng COM shr al,1 ; al = số lượng cổng COM
jnz L1 ; Nếu al # 0 (có cổng COM thì nhảy) HienString khong ; còn không thì hiện thông báo ‘Khong’ jmp Exit ; Nhảy đến nhãn Exit
L1:
HienString co ; Hiện thông báo ‘Co’ mov cl,al
xor ch,ch ; cx = số lượng cổng COM (chỉ số vòng lặp hiện địa chỉ) HienString M2 ; Hiện thông báo ‘So luong cong COM ma may tinh co la : ‘ add al,30h ; al là mã ASCII số lượng cổng COM
mov ah,0eh ; Chức năng hiện 1 ký tự ASCII lên màn hình int 10h
HienString M3 ; Hiện thông báo ‘Dia chi cac cong COM la : ‘ xor ax,ax
mov es,ax
lea bx,400h ; es:bx = 0:400h (nơi chứa địa chỉ cổng COM1) L2:
mov ax,es:[bx] ; ax = địa chỉ COM
call HIEN_HEXA ; Hiện địa chỉ dạng HEXA lên màn hình HienString space ; Hiên một số dấu cách
add bx,2 ; bx trỏ đến các byte chứa địa chỉ cổng COM tiếp theo loop L2
Exit:
mov ah,1 ; Chờ 1 ký tự từ bàn phím int 21h
mov ah,4ch ; Về DOS int 21h
INCLUDE lib2.asm ; lib2.asm chứa chương trình con HIEN_HEXA END PS
Bài 3
Hãy viết chương trình cho biết máy tính bạn đang dùng có cổng LPT nào hay không? Nếu có thì bao nhiêu cổng và cho biết địa chỉ các cổng đó (địa chỉ cổng phải là HEXA). Cách giải : Chú ý byte của có địa chỉ 0:411h của vùng dữ liệu ROM BIOS có chứa các thông tin liên quan đến thông tin về số lượng cổng LPT mà máy tính đang dùng có, cụ thể như sau:
x x
Chú ý : Địa chỉ LPT1 có trong 2 byte có địa chỉ 0:408h và 0:409h
Địa chỉ LPT2 có trong 2 byte có địa chỉ 0:40ah và 0:40bh ….
Khi chương trình chạy yêu cầu có dạng :
Chú ý : Giống bài 2
INCLUDE lib1.asm .MODEL small .STACK 100h .DATA
M1 db ’May tinh dang dung co cong LPT không ? $’ co db ‘Co $’
khong db ‘ Khong $’
M2 db 13,10,’So luong cong LPT ma may tinh co la : $’ M4 db 13,10,’Dia chi cac cong LPT la : $’
space db ‘ $’ .CODE PS: mov ax,@data mov ds,ax CLRSCR
HienString M1 ; Hiện thông báo ‘May tinh dang dung co cong LPT khong ?’ int 11h ; Ngắt hệ thống thực hiện việc đưa nội dung ô nhớ 0:411h -> ah mov al,ah ; Đưa nội dung 0:411h -> al
mov cl,6
shr al,cl ; al = số lượng cổng LPT
jnz L1 ; Nếu al # 0 (có cổng LPT thì nhảy) HienString khong ; còn không thì hiện thông báo ‘Khong’ jmp Exit ; Nhảy đến nhãn Exit
L1: 0 0 … không có cổng LPT 0 1… có 1 cổng LPT 1 0. .. có 2 cổng LPT 1 1… có 3 cổng LPT . . .
May tinh dang dung co cong LPT khong ? Co
So luong cong LPT la : 4
HienString co ; Hiện thông báo ‘Co’ mov cl,al
xor ch,ch ; cx = số lượng cổng LPT (chỉ số vòng lặp hiện địa chỉ) HienString M2 ; Hiện thông báo ‘So luong cong LPT ma may tinh co la : ‘ add al,30h ; al là mã ASCII số lượng cổng LPT
mov ah,0eh ; Chức năng hiện 1 ký tự ASCII lên màn hình int 10h
HienString M3 ; Hiện thông báo ‘Dia chi cac cong LPT la : ‘ xor ax,ax
mov es,ax
mov bx,408h ; es:bx = 0:408h (nơi chứa địa chỉ cổng LPT1) L2:
mov ax,es:[bx] ; ax = địa chỉ LPT
call HIEN_HEXA ; Hiện địa chỉ dạng HEXA lên màn hình HienString space ; Hiên một số dấu cách
add bx,2 ; bx trỏ đến các byte chứa địa chỉ cổng COM tiếp theo loop L2
Exit:
mov ah,1 ; Chờ 1 ký tự từ bàn phím int 21h
mov ah,4ch ; Về DOS int 21h
INCLUDE lib2.asm ; lib2.asm chứa chương trình con HIEN_HEXA END PS
Bài 4
Hãy viết chương trình cho biết máy tính bạn đang dùng có card điều khiển màn hình loại gì (mono hay color)?
Cách giải : Chú ý byte của có địa chỉ 0:410h của vùng dữ liệu ROM BIOS có chứa các thông tin liên quan đến loại card điều khiển màn hình, cụ thể như sau :
x x
Khi chương trình chạy yêu cầu có dạng :
INCLUDE lib1.asm .MODEL small .STACK 100h .DATA 1 1 … mono ≠ 1 1 … color
Loai card dieu khien man hinh ma may tinh co la : Color
M1 db ’Loai card dieu khien man hinh ma may tinh co la : $’ color db ‘Color $’ mono db ‘Mono $’ .CODE PS: mov ax,@data mov ds,ax CLRSCR
HienString M1 ; Hiện ‘Loai card dieu khien man hinh ma may tinh co la :’ int 11h ; Ngắt hệ thống thực hiện việc đưa nội dung ô nhớ 0:410h -> al and al,00110000b ; Tách 2 bit có thông tin liên quan đến loại card đ/k màn hình cmp al,00110000b ; Liệu có phải loại card điều khiển màn hình là mono?
jne L1 ; Không phải là card mono thì nhảy đến L1 HienString mono ; còn phải thì hiện thông báo ‘Mono’ jmp Exit ; Nhảy đến nhãn Exit
L1:
HienString color ; Hiện thông báo ‘Color’ Exit:
mov ah,1 ; Chờ 1 ký tự từ bàn phím int 21h
mov ah,4ch ; Về DOS int 21h
END PS
Bài 5
Hãy viết chương trình cho phép tạo lập một thư mục. Cách giải : Sử dụng chức năng 39h 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
tm db 13,10,’ Hay vao ten thu muc can tao : $’ Err_MD db 13,10,’ Khong tao duoc thu muc !$’ Suc_MD db 13,10,’ Thu muc da duoc tao !$’ tieptuc db 1310,’ Co tiep tuc CT (c/k) ? $’ buff db 30
Hay vao ten thu muc can tao : x
Thu muc da duoc tao ! hoặc Khong tao duoc thu muc !
db ? dir_name db 30 dup(?) .CODE PS: mov ax,@data mov ds,ax L_TM0: CLRSCR
HienString tm ; Hiện thông báo tm lea dx,buff ; Vào tên thư mục cần tạo call GET_FILE_NAME
lea dx,file_name ; Chức năng tạo thư mục mov ah,39h
int 21h
jnc L_TM1 ; Nếu bit cờ CF=0 thì nhảy đến L_TM1, Hienstring Err_MD ; còn CF=1 thì hiện thông báo lỗi
jmp EXIT_TM L_TM1:
Hienstring Suc_MD ; Hiện thông báo thành công Exit_TM:
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_TM ; Không phải 'c' thì nhảy đế Thoat_TM, jmp L_TM0 ; còn đúng là 'c' thì nhảy về L_TM0 Thoat_TTM:
mov ah,4ch ; Về DOS int 21h
INCLUDE lib3.asm ; lib3.asm chứa CT con GET_DIR_NAME END PS
Chú ý: Xóa thư mục và chuyển thư mục giống bài tập trên chỉ cần thay chức năng 39h bằng
chức năng 3ah (xóa thư mục) hoăc 3bh (chuyển thư muc).
Bài 6
Hãy viết chương trình copy 1 tệp. Cách giải :
1. Vào tên tệp cần copy đi (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. Vào tên tệp cần copy đến (gọi CT con GET_FILE_NAME) 4. Tạo tệp mới và mở (CN 3ch của ngắt int 21h)