使用 PC 扬声器生成音乐音调

Generating music tone using PC speaker

我有这个代码:

IDEAL
MODEL small
STACK 100h
DATASEG
CODESEG

PROC PLAY
        mov al, 182         
        out 43h, al          

        out 42h, al        
        mov al, ah          
        out 42h, al 
        in al, 61h         
        or al, 00000011b   
        out 61h, al        
        mov bx, 15         
pauseSound:
        mov cx, 65535
pause2:
        dec cx
        jne pause2
        dec bx
        jne pauseSound

        in  al, 61h         

        and al, 11111100b   
        out 61h, al         

        RET
    END PLAY

start:      


       mov ax, 2712
       call PLAY


       MOV AX, 3834
       call PLAY
exit :

    mov ax, 4C00h
    int 21h
    END start

该程序需要播放一种声音几秒钟,然后播放另一种声音几秒钟。但是我只听到第一个而不是第二个,problem/bug在哪里?
谢谢

指令 END 告诉 TASM 中断程序集,它也指定了程序入口点。 TASM 源代码中应该只有一个这样的指令,通常在最后一行。由于您的拼写错误,TASM 仅汇编了子例程 PLAY,它不够智能,无法警告您 PROC PLAY 未正确终止。

END PLAY 更改为 ENDP PLAY,您的程序将运行。

更新: 我用

组装了你的程序
> tasm Meow.asm
Turbo Assembler  Version 4.0  Copyright (c) 1988, 1993 Borland International
Assembling file:   Meow.asm
Error messages:    None
Warning messages:  None
Passes:            1

然后在 Windows 10 64 位的 DOSBox 中链接并 运行:

> ver
> DOSBox version 0.74-2. Reported DOS version 5.00.
> tlink Meow.obj
Turbo Link  Version 3.01 Copyright (c) 1987,1990 Borland International
> Meow.exe
>

它播放了高音和低音两个音调,每个音调大约 0.8 秒,然后退出,完全符合预期。

如果它在您的系统上播放时间很短,请尝试增加计时常数 mov bx, 15。您还可以在 pause2 处添加一些虚拟指令,但通常,通过 jne pause2 测量时间在较新的计算机上非常不可靠,尤其是在模拟器上。