CÁC BÀI TẬP LẬP TRÌNH HỆ THỐNG

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 33 - 40)

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

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

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

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

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)

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 33 - 40)