汇编编写的音乐播放器能正确运行但是不出声是什么问题,帮忙看一下QAQ

炖蛋白豆腐 2016-07-13 02:37:02
自己编写了一个打开输入路径曲谱播放音乐的程序,但是在运行过程中不出声,求高手指点一下TAT,先道一声谢谢啦!

曲谱内容:
EQDQCQDQEQEQEHDQDQDHEQGQGHEQDQCQDQEQEQEQEQDQDQEQDQCF

代码
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP('STACK...')
STACK ENDS

DATA SEGMENT
MESIN DB 'Please input the path of the music score.',13,10,'$'
MESERR DB 'Music score open error!',13,10,'$'
PK DB 'Press any key to exit.',13,10,'$'
RERR DB 'Reading Error!',13,10,'$'
FOK DB 'File Open Successed',13,10,'$'
MCNUM DW 0 ;曲谱文件号待存
BUFFLEN=50
BUFFER DB BUFFLEN
DB ?
DB BUFFLEN DUP(0)
MUS_FRE DB 0
MUS_TIME DB 0
MUCFRE DW 0
MUCTIME DW 0
DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA

START PROC FAR
MOV AX,DATA
MOV DS,AX

LEA DX,MESIN
MOV AH,09H
INT 21H

MOV DX,OFFSET BUFFER
MOV AH,0AH
INT 21H ;输入源文件路径

LEA SI,BUFFER
MOV AL,[SI+1]
XOR AH,AH
ADD SI,2
ADD SI,AX
MOV BYTE PTR[SI],0 ;将输入文件名的最后一个回车符换成0

MOV DX,OFFSET BUFFER+2
MOV AH,3DH
INT 21H ;打开源文件
JNC OPENOK ;打开成功跳至OPENOK
LEA DX,MESERR
MOV AH,09H
INT 21H
JMP EXIT

OPENOK:
MOV MCNUM,AX
LEA DX,FOK
MOV AH,09H
INT 21H

MUCREAD:
MOV DX,OFFSET MUS_FRE
MOV CX,2
MOV BX,MCNUM
MOV AH,3FH
INT 21H

JNC READOK
LEA DX,RERR
MOV AH,09H
INT 21H

READOK:
CALL MUSIC
OR AX,AX
JZ MUCOK
JMP MUCREAD

MUCOK:
MOV BX,MCNUM
MOV AH,3EH
INT 21H

EXIT:
LEA DX,PK
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV AH,4CH
INT 21H
START ENDP

MUSIC PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP

CALL TRANS

LEA SI,MUCFRE
LEA BP,DS:MUCTIME

MOV DI,[SI]
MOV BX,DS:[BP]
CALL SOUNDF

POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
MUSIC ENDP

TRANS PROC NEAR
PUSH AX
PUSH BX

XOR AX,AX
XOR BX,BX
MOV AL,MUS_FRE
CMP AL,'C'
JNZ FRE_D
MOV BX,262
MOV MUCFRE,BX
JMP TTIME
FRE_D:CMP AL,'D'
JNZ FRE_E
MOV BX,294
MOV MUCFRE,BX
JMP TTIME
FRE_E:CMP AL,'E'
JNZ FRE_F
MOV BX,330
MOV MUCFRE,BX
JMP TTIME
FRE_F:CMP AL,'F'
JNZ FRE_G
MOV BX,349
MOV MUCFRE,BX
JMP TTIME
FRE_G:CMP AL,'G'
JNZ FRE_A
MOV BX,392
MOV MUCFRE,BX
JMP TTIME
FRE_A:CMP AL,'A'
JNZ FRE_B
MOV BX,440
MOV MUCFRE,BX
JMP TTIME
FRE_B:CMP AL,'B'
MOV BX,262
MOV MUCFRE,BX

TTIME:
XOR AX,AX
XOR BX,BX
MOV AL,MUS_TIME
CMP AL,'F'
JNZ TIME_H
MOV BX,100
MOV MUCTIME,BX
JMP TRANSOK
TIME_H:CMP AL,'H'
JNZ TIME_Q
MOV BX,50
MOV MUCTIME,BX
JMP TRANSOK
TIME_Q:CMP AL,'Q'
JNZ TIME_E
MOV BX,25
MOV MUCTIME,BX
JMP TRANSOK
TIME_E:CMP AL,'E'
MOV BX,13
MOV MUCTIME,BX

TRANSOK:
POP BX
POP AX
RET
TRANS ENDP

SOUNDF PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI

MOV AL,0B6H
OUT 43H,AL

MOV DX,12H
MOV AX,348CH
DIV DI

OUT 42H,AL
MOV AL,AH
OUT 42H,AL

IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL

WAIT1:
MOV CX,663
CALL WAITF

DELAY:
LOOP DELAY
DEC BX
JNZ WAIT1

MOV AL,AH
OUT 61H,AL

POP DI
POP DX
POP CX
POP BX
POP AX
RET
SOUNDF ENDP

WAITF PROC NEAR
PUSH AX
WAITF1:
IN AL,61H
AND AL,10H
CMP AL,AH
JE WAITF1
MOV AH,AL
LOOP WAITF1
POP AX
RET
WAITF ENDP

CODE ENDS
END START
...全文
1469 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
uid123 2016-09-11
  • 打赏
  • 举报
回复
学习一下,受到很大教育。
用户 昵称 2016-09-08
  • 打赏
  • 举报
回复
要看什么系统了,我以前的程序xp下出声音,win7就不行了。
赵4老师 2016-08-22
  • 打赏
  • 举报
回复
关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
炖蛋白豆腐 2016-07-14
  • 打赏
  • 举报
回复
引用 3 楼 baidu_29183065的回复:
windows下的dos不允许直接操作port,代码那些in和out基本上被系统无视。透过dosbox之类的模拟是可以发声的,路径须做好mount设定,比如要开启d:\上的档案,可以在dosbox下键入mount d: d:\
原来是in和out这类命令没作用了啊,非常感谢!
  • 打赏
  • 举报
回复
不是in、out的问题,MOV AH,3DH ---> MOV AX,3D00H
baidu_29183065 2016-07-13
  • 打赏
  • 举报
回复
windows下的dos不允许直接操作port,代码那些in和out基本上被系统无视。透过dosbox之类的模拟是可以发声的,路径须做好mount设定,比如要开启d:\上的档案,可以在dosbox下键入mount d: d:\
炖蛋白豆腐 2016-07-13
  • 打赏
  • 举报
回复
引用 1 楼 zara的回复:
没试,干看也难看出来。可能是需要纯 dos 环境的原因吧,哪怕是虚拟机里的
确实得在dosbox下,示例程序也是只能在dosbox下响。但是我的得先输入路径,然而在dosbox下就不能正确打开文件了,这个怎么解决啊
zara 2016-07-13
  • 打赏
  • 举报
回复
没试,干看也难看出来。可能是需要纯 dos 环境的原因吧,哪怕是虚拟机里的

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧