实验目的:(1)掌握利用DOS、BIOS功能调用实现I/O的方法。
(2)掌握程序直接控制I/O方式。
实验内容:(1)利用DOS INT 21H功能调用,编程实现对输入的字符串进
行统计;
(2)利用BIOS INT 10H功能调用,控制字符显示特性。 (3)通过I/O指令直接对61端口的控制,实现扬声器发声。
实验过程:
(1)从键盘输入一串字符(<80,回车结束),统计其中的数字、大写字母、小写字
母和其它字符。
① 程序说明。
1)主程序利用INT 21H 的1h号功能调用输入字符串,并调用各子程序完成
统计、显示功能;
2)子程序disp_msg: 利用INT 21H 的9h号功能调用显示字符串;
入口参数:DS:DX指向字符串
3)子程序disp_cnt: 利用INT 21H 的2h号功能调用显示统计数字;
入口参数: BX为待显示值
4)子程序 count: 分类统计;
入口参数:DS:DX指向字符串
出口参数: BX为数字字符;CX为大写字母;BP为小写字母;DI为其它字符
data segment
str db 80 dup (?)
msg0 db 13,10, 'Enter a string:', '$' msg1 db 13,10, 'Numbers=', '$' msg2 db 13,10, 'Upletters=', '$' msg3 db 13,10, 'Lowletters=', '$' msg4 db 13,10, 'Others=', '$' data ends
code segment
assume cs:code,ds:data go: mov ax, data mov ds, ax
lea dx , msg0 call disp_msg mov ah, 1
lea si , str lp1:
int 21h
mov [si], al cmp al, 13 je L0
inc si jmp lp1 L0:
lea dx, str call count lea dx, msg1
call disp_msg call disp_cnt lea dx, msg2 call disp_msg mov bx, cx call disp_cnt lea dx, msg3 call disp_msg mov bx, bp call disp_cnt lea dx, msg4 call disp_msg mov bx, di call disp_cnt mov ah, 4ch int 21h
disp_msg proc push ax
mov ah, 9 int 21h
pop ax ret
disp_msg endp disp_cnt proc push ax push dx mov ax, bx mov bl, 10 div bl
mov bh, ah mov dl, al add dl, 30h mov ah, 2 int 21h
mov dl, bh add dl, 30h mov ah, 2 int 21h pop dx pop ax ret
disp_cnt endp
count proc push ax push si
xor bx, bx; Numbers xor cx, cx; Upletters xor bp, bp; Lowletters xor di, di; Others mov si, dx next:
mov al, [si] cmp al, 13 je done cmp al, '0' jb other
cmp al, '9' jbe num cmp al, 'A' jb other cmp al, 'Z'
jbe U_letter cmp al, 'a' jb other cmp al, 'z' jbe L_letter other:
inc di jmp cont num:
inc bx jmp cont U_letter:
inc cx
jmp cont L_letter:
inc bp cont:
inc si jmp next done:
pop si pop ax
ret count endp code ends end go
② 补充完整程序,编辑、连接、运行、调试程序。 ③ 记录编译过程中错误,并分析原因。 ④ 画出子程序disp_cnt的流程图。
(2)从键盘输入一串密码(<40)后,以闪烁的方式显示密码。
① 程序说明。
1) 利用INT 21H 的7h号功能调用输入密码;
2) 利用BIOS 10H 的3h号功能调用获得当前显示位置;利用BIOS 10H 的
13h号功能以红底白字闪烁显示密码信息;
3) 子程序disp1利用INT 21H 的2h号功能调用显示字符;子程序cls利用
BIOS 10H 的6h号功能清屏。
data segment
msg1 db 13,10, 'Type a secret message :', '$' msg2 db 13,10, 'Your secret message is:', '$' secret db 40 dup (?) data ends code segment main proc far
assume cs:code,ds:data go:
mov ax,data mov ds,ax mov es,ax
call cls
lea dx, msg1 mov ah,9 int 21h
xor bx,bx lp1: mov ah,7 int 21h cmp al,13 je disp
mov secret[bx], al inc bx call dsp1 jmp lp1 disp:
lea dx, msg2 mov ah,9
int 21h mov si,bx mov ah, 3 mov bh,0 int 10h
mov cx,si mov al,0
lea bp,secret mov bl,0cfh mov ah,13h int 10h done:
mov ax,4c00h int 21h main endp
dsp1 proc near push dx push ax
mov dl, '*' mov ah, 2 int 21h pop ax pop dx ret dsp1 endp cls proc push ax push bx push cx push dx mov ch, 0 mov cl, 0 mov dh, 24 mov dl, 79 mov bh,7 mov al, 0 mov ah,6 int 10h pop dx
pop cx pop bx pop ax ret cls endp code ends
end go
② 在全屏方式下编辑、连接、运行(在全屏方式下)、调试程序。 ③ 记录编译过程中错误,并分析原因。
(3)用I/O指令直接控制输出控制寄存器(I/O端口为61h)的第1位,使该位按所
需要的频率进行1和0的交替变化,从而控制开关电路产生一串脉冲波形,这些脉冲经放大后驱动扬声器发声音)。
① 程序说明。
程序通过I/O指令使设备控制寄存器(1/O端口地址为61H)的第1位交替为0和l,而61H端口的第l位和扬声器的脉冲门相连,交替为0和l的脉冲电流被放大后送到扬声器使之发出了声音。
本例中CX=3000 它决定发声频率 值小声音尖锐, 值大声音低沉。 DX=6000决定 发声时间长短。
1) 主程序提示输入任一键后开始发声; 2) 子程序sound 实现发声。
SOUND
data segment
msg1 db 13,10, ‘Enter a key to ring.....’, ‘$’ data ends code segment main proc far
assume cs:code,ds:data go:
mov ax,data mov ds,ax
lp1: lea dx, msg1 mov ah,9 int 21h mov ah,7 int 21h cmp al,13 je done call sound mov cx, 2000h wai1:
loop wai1 jmp lp1 done:
mov ax,4c00h int 21h main endp
sound proc near mov bx,800h in al,61h
and al,11111100b sou:
wai:
sound code xor al,00000010b out 61h,al
mov cx,8000h
loop wai dec bx jnz sou
and al,11111100b out 61h,al ret endp ends
end go
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- net188.cn 版权所有 湘ICP备2022005869号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务