8086 - 蜂鸣直到得到输入

Posted

技术标签:

【中文标题】8086 - 蜂鸣直到得到输入【英文标题】:8086 - Beep until get input 【发布时间】:2018-01-16 10:03:31 【问题描述】:

我是汇编语言的新手,我想用 8086 汇编创建一个程序。 (emu8086)所以程序应该连续发出哔哔声,直到按下键E。现在第一种方法是每次使用简单的跳转来检查输入,这是我想出的代码:

    macro beep
    mov dl,7h
    mov ah,2
    int 21h
endm

.model small
.stack 64

.code :  

lp:

beep

mov ah,1
int 21h

cmp al,'e'
je end

jmp lp

end:
mov ah,4ch
int 21h

现在我想要实现的是蜂鸣声必须是连续的,我不希望用户在每个循环中都进行输入。类似于 C 中的多线程,蜂鸣声是在另一个线程中完成的。

这在 8086 中是否可能?

【问题讨论】:

您可以尝试Bios 16h services 而不是DOS 21h 以获得更多选项来检查键盘(但如果您想要类似动作游戏的重复配置,它仍然会通过重复配置键入键盘来缓冲读取DOS 中的键盘,您必须安装自己的键盘处理程序中断代码,该代码将直接处理来自键盘的中断请求)。我不确定哔声会持续多长时间,即使您连续调用它,DOS 服务也不完全是音乐 API。 “这是否可能”:“哔哔”以给定的频率不断打开/关闭蜂鸣器。例如在10k 赫兹,你有 100ms 的时间来找出,如果按键被按下,这应该足够了。所以是的 - 这应该是可能的。 【参考方案1】:

BIOS 函数 01h 检查密钥是否处于挂起状态。

如果没有,您会立即重新发出哔哔声。 如果存在密钥,则使用 BIOS 函数 00h 获取它,如果不是“e”,则继续重新发出哔哔声。

这可能是在按下字符“e”之前获得连续哔声的最简单解决方案。

lp:
 beep
 mov ah, 01h
 int 16h      ;Gives ZF
 jz  lp       ;No key waiting
 mov ah, 00h
 int 16h      ;Gives AX
 cmp al, 'e'
 jne lp
 mov ax, 4C00h
 int 21h

【讨论】:

【参考方案2】:

如果它模拟标准 PC 环境,您可以设置计时器“芯片”(硬件中的 8255)来控制扬声器。打开它,它会发出哔哔声,直到您将其关闭,无论您的代码在做什么。

【讨论】:

以上是关于8086 - 蜂鸣直到得到输入的主要内容,如果未能解决你的问题,请参考以下文章

8086/8088的指令都有哪些寻址方式

在 8086 中读取文件直到文件结束

BUUCTF-RE-8086

汇编 8086 中的 SHR 命令

8086汇编语言程序查找两个数字的GCD

轮询直到得到具体结果?