2017-12-15 18 views
0

어떻게 동시에 두 작업을 수행 할 수 있습니까?어셈블리의 멀티 스레딩 32 비트 또는 16 비트

계속해서 뭔가를 표시하는 동안 프로그램은 다른 쪽에서 키 누르기 이벤트를 기다려야합니다.

내 수업 프로젝트를위한 간단한 게임을 만들고 싶습니다. C++에서는 입력 이벤트를 표시하기 위해 다른 스레드를 사용했습니다.

무언가를 계속 표시하면서 어떻게 키 누르기 값을 얻을 수 있습니까?

인터럽트를 사용할 수 있습니까? 그렇다면 우리는 어떻게 그것을 사용할 수 있습니까? INT?

I는 MASM 32 비트 또는 16 비트를 사용하고

+0

사용자가 직접 인터럽트 처리기를 설치할 수는 없습니다. 운영 체제 만 할 수 있습니다. 그런 다음 키를 누를 때마다 OS에 알려달라고 요청합니다. 어떤 OS를 사용하고 있습니까? – ComicSansMS

+2

간단한 해답을 MT에서 피할 수있는 아이디어를 codereview 사이트에서 확인할 수 있습니다 (대부분의 프로그래머가 8/16 비트 컴퓨터에서 ~ 20 년 동안 MT를 사용하기 때문에 비용이 많이 들었습니다) : https : //codereview.stackexchange.com/a/133845/110284 - 그러면 OS에서 버퍼링 된 입력을 재사용하거나 드로잉 루프가 빠르면 드로잉 사이의 컨트롤을 폴링하는 것만으로도 충분합니다. 대부분의 휴먼 버튼 동작에는 지속 시간이 있습니다 가볍게 버튼을 탭하려고해도 50ms 이상, 70-150ms를 향해 더 길게 설정하십시오. 그러나 귀하의 목표 OS를 먼저 선택하여 귀하의 가능성을 확인하십시오. – Ped7g

+0

@ComicSansMS Windows –

답변

0

int 동기는 인터럽트를 발생시킨다. 소프트웨어 생성 인터럽트에 사용하는 것입니다.

코드가 링 0 (즉, 16 비트 리얼 모드에서는 일반이지만 32 비트 보호 모드에서는 정상이 아닌 커널 모드)에서 실행되는 경우 인터럽트 처리기를 설치하여 인터럽트를 얻을 수 있습니다.

또는 (as Ped7G says) 비 차단 int 21h 또는 int 10h 시스템 호출을 사용하여 그리기 루프 당 한 번 키 누르기를 폴링 할 수 있습니다.


전체 멀티 태스킹 OS에서 실행 (예 : 윈도우 NT 이상 또는 리눅스, OS X,하지만 하지 DOS)는, 당신의 유일한 옵션은 (시스템 호출을 사용하여) 요청하는 것입니다 OS에서 비동기 이벤트를 프로세스에 알립니다. 이것은 하드웨어에 직접 액세스 할 수 없기 때문에 기본적으로 어셈블리 언어와 관련이 없으며 OS는 모든 인터럽트 처리기를 제어합니다. 즉 동일한 시스템 호출에 대해 동일한 인수를 사용하여 C에서와 동일한 방식으로 수행 할 수 있습니다. 유일한 차이점은 ecx를 /푸시 ebx/푸시 eax/call foo/add esp, 12 대신 foo(a,b,c) 대신 푸시하는 것입니다.

예를 들어, 다른 스레드를 시작하여 키 대기 시스템 호출 (블록)을 호출 한 다음 플래그 (메인 스레드가 때때로 폴링하는)를 설정하거나 대기하는 스레드를 가질 수 있습니다 keypress는 실제로 keypress 자체를 처리합니다.

또한 키 대기 스레드가 사용자 스레드의 인터럽트 처리기와 거의 비슷한 주 스레드에 신호를 보낼 수도 있습니다. 신호가 순수한 소프트웨어 발명임을 제외하고 메인 쓰레드가 설치된 시그널 핸들러 기능을 실행시킴으로써 "신호"를 전달하는 것은 OS에 달렸습니다. (Windows에 POSIX 신호와 정확히 같은 것이 있으면 IDK로 Windows 실행 파일을 개발하기 위해 MASM을 사용한다고 가정하면 메인 스레드의 무한 루프를 방해하는 옵션이 아닐 수 있습니다.)

비동기 I/O 또한 가능합니다. 예를 들어 프레임마다 그림을 그은 후에 논 블로킹 시스템 호출로 키 누름에 대한 기본 스레드 폴링을 할 수 있습니다.

여기에 자세히 설명하지는 않겠지 만, 내가 사용한 문구 중 일부를 Google에 추가 할 수 있어야합니다. 질문은 특정 답변에 대해서는 너무 일반적이지만 OS 기 계가 이러한 종류의 작업을 지원하는 방식입니다.