汇编:响铃程序(从键盘接受输入字符,如是数字N ,则响铃N次;如不是数字,则不响)

汇编:响铃程序(从键盘接受输入字符,如是数字N ,则响铃N次;如不是数字,则不响),第1张

ts DB 'please input:$' --在这里,加上0ah,0dh,,即可省去回车换行的子程序

ts DB 0ah,0dh,'please input:$' --这样即可

----

这个程序,没有延时部分,几个声音,都连一起了,发成一个音了。

……

a0002:MOV AH,02 响铃程序段

<<<--延时程序,应该加在这里

MOV DL,07

INT 21H

LOOP a0002 循环指令

……

code SEGMENT

ASSUME 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 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 /*这个地方要注意保护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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11213038.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存