
ts DB 0ah,0dh,'please input:$' --这样即可
----
这个程序,没有延时部分,几个声音,都连一起了,发成一个音了。
……
a0002:MOV AH,02 响铃程序段
<<<--延时程序,应该加在这里
MOV DL,07
INT 21H
LOOP a0002 循环指令
……
code SEGMENTASSUME CS:code
start:
MOV AH,1
INT 21h
MOV AH,0
MOV CX,AX
begain:MOV DL,7
MOV AH,2
INT 21h
LOOP begain
MOV AH,4ch
INT 21h
code ENDS
END start
你试试,可能由于相隔的时间太短,分不清到底是响了几声
还要做一个延时的程序段!! 但这是最基础的,很简单。
下面有个复杂的,你看看,是从网上copy的:
data SEGMENT
ts DB 'please input:$'
again DB 0ah,0dh,'again?(y/n)$'
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
enter1 PROC 子程序,实现的功能是回车换行
PUSH AX
PUSH DX
MOV AH,02h
MOV DL,0dh
INT 21h
MOV DL,0ah
INT 21h
POP DX
POP AX
RET
enter1 ENDP
start:
MOV AX,data 加载数据段
MOV DS,AX
a0003:LEA DX,ts
MOV AH,09h 调用09号功能显示输出字符串
INT 21h
MOV AH,01h 调用01号功能接收字符
INT 21h
CMP AL,'1' 接收的字符与1的ASCll比较,小于则转移
JB a0001
CMP AL,'9' 接收的字符与9的ASCll比较,大于则转移
JA a0001
SUB AL,30h 将ASCll码转换为数字
XOR AH,AH 将AX高八位清零,此时AX中的数字为接收的数字
MOV CX,AX 将AX的值赋给CX以控制循环
a0002:MOV AH,02 响铃程序段
MOV DL,07
INT 21H
LOOP a0002 循环指令
a0001:LEA DX,again 提示是否再次运行本程序
MOV AH,09h
INT 21h
MOV AH,01h 接收字符
INT 21h
CALL enter1
CMP AL,'y' 将接收的字符与y比较,相同则转移
JE a0003
CMP AL,'Y' 将接收的字符与Y比较,相同则转移
JE a0003
MOV AH,4ch
INT 21h
code ENDS
END start
对于第一个程序,我说了,可能会因为电脑的运行时间太短,你分不清到底响了几声,你还要自己写一个延时的程序,就像2楼那样的。
那它确实是可以响n声,只是你判断不出来而已~
DATA SEGMENTSTRING DB 'Input error!','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AH,1
INT 21H
push ax /*这个地方要注意保护AX,因为你下面的回车换行使用了AH,虽然输入的内容存在AL中,但编译运行时候某些位可能产生变化导致运行不准
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
pop ax
CMP AL,31H
JL ERROR
CMP AL,39H
JG ERROR
SUB AL,30H
MOV CH,0
MOV CL,AL
BELL: MOV DL,07H /*这里你需要加上延时程序才能准确听到你的响铃次数,负责只能听到一次
MOV AH,2
INT 21H
LOOP BELL
JMP EXIT
ERROR: LEA DX,STRING
MOV AH,9
INT 21H
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
下面这个是帮你加了个延时程序,可以听到准确的响铃了
DATA SEGMENT
STRING DB 'Input error!','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AH,1
INT 21H
push ax
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
pop ax
CMP AL,31H
JL ERROR
CMP AL,39H
JG ERROR
SUB AL,30H
MOV CH,0
MOV CL,AL
BELL: MOV DL,07H
MOV AH,2
INT 21H
call delay
LOOP BELL
JMP EXIT
ERROR: LEA DX,STRING
MOV AH,9
INT 21H
delay proc
push cx
mov cx,00fffh
ll1:
push cx
mov cx,0ffffh
ll2:
loop ll2
pop cx
loop ll1
pop cx
ret
delay endp
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)