如何在Linux-Assembler中发出哔哔声?

时间:2016-12-15 13:23:29

标签: linux assembly nasm x86-64

我想在汇编程序中发出一声哔哔声。

喜欢

beep()

这可能吗?

我尝试使用带有BELL-Symbol的sysCall写入。 但它没有做任何事情。

我使用Linux-64-Nasm汇编程序,而且,在构建编译器时,我不想使用C库。

section .data
cmp_BLANK: db 0x0a
cmp_interr: db "error, You have typed in a non-Integer Character!", 0x0a
cmp_interrlen: equ $-cmp_interr
cmp_buffer: times 9 db 0x00
cmp_beep: db 0x07

section .bss

section .text
global _start
_start:
call func_main
mov eax, 1
mov ebx, 0
int 80h
func_main:
mov eax, 4
mov ebx, 1
mov ecx, cmp_beep
mov edx, 1
int 80h
ret        

但我没有声音。即使我用sudo运行它。

1 个答案:

答案 0 :(得分:0)

好的,首先是参考文档:http://www.cs.binghamton.edu/~reckert/220/8254_timer.html

以C实现为例:https://github.com/torvalds/linux/blob/master/drivers/input/misc/pcspkr.c#L49

这是GNU asm中的提示音:

using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;

namespace StackOverflowWebClientQuestionAnswer.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class Resultat : ControllerBase
    {
        [HttpGet]
        public async Task<IActionResult> GetResultat()
        {
            ExternalService external = new ExternalService();

            string resultat = await external.DownloadHomepage("971");

            return Ok(resultat);
        }
    }
}

此代码无法在用户空间程序中立即运行,因为内核禁止写入IO端口。为了使代码也需要 # send "set tune" command movb $0xB6, %al outb %al, $0x43 # nanosleep to let the IO complete movl $0x1000, %eax 1: subl $1, %eax cmpl $0, %eax jne 1b # set 220Hz, 0x152F == 1193180 / 220 movb $0x2F, %al outb %al, $0x42 # nanosleep movl $0x1000, %eax 1: subl $1, %eax cmpl $0, %eax jne 1b movb $0x15, %al outb %al, $0x42 # nanosleep movl $0x1000, %eax 1: subl $1, %eax cmpl $0, %eax jne 1b # turn on the speaker inb $0x61, %al movb %al, %ah orb $0x3, %al outb %al, $0x61 # sleep about 1 sec movl $0x30000000, %eax 1: subl $1, %eax cmpl $0, %eax jne 1b # turn off the speaker movb %ah, %al andb $0xfc, %al outb %al, $0x61 调用:ioperm并使用sudo运行。请参见此gist中的完整工作示例。