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:41 1h 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 000... không có cổng COM 001... có 1 công COM 010... có 2 công COM 0 1 1... có 3 công COM
Chú ý : Địa chỉ COMI 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ó đạng :
May tinh dang dung co cong COM khong 2 Co So luong cong COM la : 2
Dia chỉ cac cong COM la : 3f8 2f8 INCLUDE Iibl.asm .MODEL small .STACK 100h .DATA
MI db "May tính dang dung co cong COM không ? $” co đb “Co $°
khong db “ Khong $°
M2 db 13,10,°So luong cong COM ma may tỉnh co la : $°
M4 db 13,10,°Dia chỉ cac cong COM la : $° space db“ $°
.CODE PS:
mov ax,@data
CLRSCR
HienString MI ; Hiện thông báo “May tỉnh dang dung co cong COM khong ?”
in 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:41 1h -> al
and al,00001110b ; Tách 3 bit chứa số lượng công COM
shr al,l ; al = số lượng công COM
jnz LI ; 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
LI:
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 tính co la : ° add al30h ; al là mã ASCII số lượng công COM
mov ah,0eh ; Chức năng hiện I ký tự ASCII lên màn hình
in 10h
HienString M3 ; Hiện thông báo “Dia chi cac cong COM la : “
XOFr aX,aX mOV €S,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,4ch ; Về DOS
in 21h
INCLUDE lib3.asm : lib3.asm chứa chương trình con HIEN_HEXA END PS
Iib3.asm
; Chương trình con hiện nội dung có trong | ; thanh ghi AX lên màn hình dạng HEXA_ | HIEN HEXA PROC
push ax bx cx dx
mov bx,l6 ;bx= 16 là số chia
XOT CX,CX ; cx = số lương lần cất phần dư (sau khi chia vào stack)
div bx ; dx:ax chia cho bx (16)
cmp dx,I0 ; So sánh phần dư với 10
jb — HXI ; Nếu phần dư < 10 thì nháy đến HXI
add dx,7 ; Cộng phần dư với 7
HXI:
add dx,30h ; Chuyển sang dạng ASCII
push dx ; Cất vào stack
Ínc cx ; Đếm số lần cất vào stạck (chí số vòng lặp sau này) and ax,ax ; Dựng cờ Z (Liệu thương bằng/khác 0)
jnz HXI ; Nếu thương chưa bằng 0 thì nháy đến tiếp tục chia
HX2: ; Còn thương bằng 0 thì thiết lập vòng lặp lôi các sô (đạng ASCII
pOp ax ; vào AL đề hiện)
mov ah,0eh ¡ Chức năng hiện I1 ký tự ASCI nằm ở AL lên màn hình
In 10h loop HX2 pop dx cx bx ax
ret
HIEN HEXA ENDP
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:41 1h 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 — 0... không có công LPT 1... có 1 công LPT 0... có 2 công LPT 1... có 3 cổng LPT
Chú ý : Địa chỉ LPTIT 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ó đạng :
May tinh dang dung co cong LPT khong 2? Co So luong cong LPT la : 4
Dia chỉ cac cong LPT la : 3BC 378 278 9F0