32 位或 16 位汇编中的多线程
Multi Threading in Assembly 32 bit or 16 bit
如何同时进行两项工作?
在连续显示某些内容时,程序应等待另一侧的按键事件。
我想为我的 class 项目开发一个简单的游戏。在 C++ 中,我使用了不同的线程,一个用于显示,一个用于输入事件。
我们如何在连续显示某些内容的同时获取按键值?
可以使用中断吗?如果是,那么我们如何使用它? INT
?
我正在使用 Masm 32 位或 16 位
int
同步生成一个中断。这是您用于软件生成的中断。
你 "get" 通过安装中断处理程序来中断,如果你的代码是 运行 在 ring 0 中(即内核模式,这在 16 位实模式下是正常的,但在 32 位上不是保护模式)。
或 () 您可以使用非阻塞 int 21h
或 int 10h
系统调用在每个绘制循环中轮询一次按键。
当运行处于全多任务状态下OS(例如WindowsNT或更高版本,或Linux或OSX,但not DOS),你唯一的选择是要求(通过使用系统调用)OS 通知你的异步事件进程。这基本上与汇编语言无关,因为您不能直接访问硬件,并且 OS 保持对所有中断处理程序的控制。也就是说,您将以与在 C 中完全相同的方式进行操作,对相同的系统调用使用相同的参数。唯一的区别是你推 ecx
/ push ebx / push eax / call foo
/ add esp, 12
而不是 foo(a,b,c)
.
例如,您可以启动另一个线程并让它调用等待键系统调用(因此它会阻塞),然后设置一个标志(您的主线程偶尔会轮询),或者让线程等待按键实际处理按键本身。
您还可以让键等待线程向主线程发送某种信号,这几乎与 user-space 中的中断处理程序完全一样。除了信号是纯粹的软件发明之外,OS 通过让主线程执行它安装的信号处理函数来传递 "signal"。 (IDK if Windows 具有与 POSIX 信号完全相同的东西,因此假设您正在使用 MASM 开发 Windows 可执行文件,这可能不是中断您的无限循环的选项主线程。)
其他异步方式 I/O 也是可能的,例如,在绘制每一帧后,让主线程轮询按键并使用非阻塞系统调用。
我不会在这里详细介绍,但您应该能够 google 我使用的一些短语并找到更多。这个问题对于一个具体的答案来说太笼统了,但这就是 OS 机制支持这种事情的方式。
如何同时进行两项工作?
在连续显示某些内容时,程序应等待另一侧的按键事件。
我想为我的 class 项目开发一个简单的游戏。在 C++ 中,我使用了不同的线程,一个用于显示,一个用于输入事件。
我们如何在连续显示某些内容的同时获取按键值?
可以使用中断吗?如果是,那么我们如何使用它? INT
?
我正在使用 Masm 32 位或 16 位
int
同步生成一个中断。这是您用于软件生成的中断。
你 "get" 通过安装中断处理程序来中断,如果你的代码是 运行 在 ring 0 中(即内核模式,这在 16 位实模式下是正常的,但在 32 位上不是保护模式)。
或 (int 21h
或 int 10h
系统调用在每个绘制循环中轮询一次按键。
当运行处于全多任务状态下OS(例如WindowsNT或更高版本,或Linux或OSX,但not DOS),你唯一的选择是要求(通过使用系统调用)OS 通知你的异步事件进程。这基本上与汇编语言无关,因为您不能直接访问硬件,并且 OS 保持对所有中断处理程序的控制。也就是说,您将以与在 C 中完全相同的方式进行操作,对相同的系统调用使用相同的参数。唯一的区别是你推 ecx
/ push ebx / push eax / call foo
/ add esp, 12
而不是 foo(a,b,c)
.
例如,您可以启动另一个线程并让它调用等待键系统调用(因此它会阻塞),然后设置一个标志(您的主线程偶尔会轮询),或者让线程等待按键实际处理按键本身。
您还可以让键等待线程向主线程发送某种信号,这几乎与 user-space 中的中断处理程序完全一样。除了信号是纯粹的软件发明之外,OS 通过让主线程执行它安装的信号处理函数来传递 "signal"。 (IDK if Windows 具有与 POSIX 信号完全相同的东西,因此假设您正在使用 MASM 开发 Windows 可执行文件,这可能不是中断您的无限循环的选项主线程。)
其他异步方式 I/O 也是可能的,例如,在绘制每一帧后,让主线程轮询按键并使用非阻塞系统调用。
我不会在这里详细介绍,但您应该能够 google 我使用的一些短语并找到更多。这个问题对于一个具体的答案来说太笼统了,但这就是 OS 机制支持这种事情的方式。