2009-05-13 4 views
0

안녕하세요, int 0x80을 사용하여 nasm 어셈블리 프로그램에서 사운드 카드에 액세스하는 방법을 알고 싶습니다. 또한 사운드 카드에 액세스 할 때 어떤 값을 레지스터에 넣어야합니까?nasm을 사용하여 리눅스에서 사운드 카드에 액세스하는 방법

사운드 카드 나 다른 하드웨어 장치에 액세스하기 위해 커널에 전달해야하는 인수에 대한 세부 정보가있는 매뉴얼이나 내용이 있으시면 알려주십시오.

내가 많이 했어. C 라이브러리와 ALSA, OSS 같은 것들이 많았지 만, 내가 원했던 것은 어셈블리 프로그램 인터페이스에 대한 기초부터 배우는 것에 대한 지식이 있다면 하드웨어와.

그리고 만약 내가 접근하는 방법에 관해서 나에게 작은 코드 목록을 줄 수 있다면 나는 매우 감사 할 것이다.

답변

1

Linux에서 사용자 공간과 커널 공간 간의 인터페이스는 INT 0x80입니다.

유닉스에서 철학의 문제로 (거의) 모든 것이 파일이므로 사운드 카드는 "문자 파일"로 취급됩니다. 커널 syscall은 POSIX 사양에 따라 다릅니다 (예 : "open", "close", "ioctl", "read", "write").

사운드 카드에 대한 액세스는 드라이버 인터페이스를 통해 "/ dev /"아래의 파일로 수행됩니다. 일부 샘플 설명서는 OSS documentation에 있지만 현재 있는지 여부는 확실하지 않습니다.

이 통신을 관찰하려면 'strace'를 사용하여 기존 응용 프로그램에서 사용중인 시스템 호출을 확인할 수 있습니다.보통은 C 라이브러리를 통해 "개방"을 얻을 것

 
    open("/dev/dsp", ...) 
    ioctl() 
    write() 
    ... 
    write() 
    close() 

,하지만 당신은 그것을 건너 뛰려면 있기 때문에, 당신은 콜에게 몇 가지 방법을 찾을 수 있습니다 : -

당신은 같은 순서를 볼 전망이다 , 당신은 그 EAX가 5 알 수 있습니다, 그리고 매개 변수의 나머지 부분은 EBX에있는 하나의 방법은 당신은 개방이 < __libc_ 개방 >를 찾아 콜 0x5 찾을 수 있습니다, 예를 들어

 
     objdump -d /usr/lib/libc.a 

것 ecx 및 edx. (사용법과 매개 변수는 Linux Syscalls에도 나와 있습니다.)

0

사용자 모드에서 이것은 작동하지 않습니다. 사운드 하드웨어에 직접 액세스 할 수 없습니다.

커널 모드 드라이버를 만들면 사운드 카드 하드웨어를 직접 찔러 낼 수는 있지만 대부분의 공급 업체는 서로 다른 구현 방식을 사용하며 일관된 표준을 따르지 않는다고 생각합니다. 최신 사운드 카드는 여전히 Adlib & SoundBlaster 16 호환 가능 - 하드웨어 표준 WAY 게임이 DOS를 대상으로하고 하드웨어를 직접 사용했을 때 돌아 왔지만 더 이상 유효하지 않은 경우 놀랄 일이 아닙니다. 빠른 검색을 통해 이러한 레거시 카드의 인터페이스에 직접 액세스 할 수 있습니다. 또는 가상 컴퓨터에서 DOS를 실행하고 하드웨어에 액세스 할 수 있습니다. 대부분의 가상 컴퓨터는이 수준의 사운드 카드를 에뮬레이트합니다.

1

이것은 사운드 카드 드라이버가하는 것입니다. O/S 또는 응용 프로그램에서 사용할 수있는 공통 API를 구현하려면 각 사운드 카드에 대해 맞춤 작성해야합니다. 다른 하드웨어 장치에서도 마찬가지입니다. 하드웨어 제조업체는이 수준에서 물건에 액세스하는 방법에 대해 개방적 인 경향이 있습니다 (한 가지 경우).

필자는 Linux 전문가는 아니지만 모든 O/S에서 상당히 근본적인 문제입니다.

0

당신이하려고하는 것에 따라, 사운드 카드에 대한 인터페이스를 처리하기 위해 기존 라이브러리를 사용하는 것이 더 나을 것입니다. 사운드 카드 드라이버는 의심 스럽지만, 리눅스에서 C로 끝내는 것이 최선일 것입니다.

Portaudio은 비교적 사용하기 쉬운 하나 (무료) 하나입니다. one example lib using portaudio with a C interface (I'm the author of wwviaudio).

FMOD은 무료이지만 게임 프로그래밍 담당자들에게는 큰 것으로 보입니다.

sdl mixer은 리눅스 게임 개발자들에게 큰 또 다른 게임입니다.

JACK은 리눅스 프로 오디오 세계에서 큽니다. (열정 - Protools에 대한 리눅스의 대답을 생각해보십시오.)

사용자 공간에서 오디오 하드웨어와 직접 대화하는 것은 의미가 없습니다.

관련 문제