如果 x86 程序集中有任何 pausing/sleeping 或事件

If there is any pausing/sleeping or events in x86 assembly

我想知道 x86-64 中的汇编级是否有任何允许您休眠的东西/wait,这样在等待完成之前没有指令 运行。我看过 WAIT 和 PAUSE 指令,但我不确定它们是否相关。

我会这样想象:

start:
  wait 123, oninterrupt ; 123 milliseconds
  ; then it will go here after that time
oninterrupt:
  ; ctrl-c pressed, now exit

同样,我想知道 x86 中是否有事件 hooks/handlers。因此,如果有人按下 CTRL+C,就会有一个中断事件发送到某处的程序集,您可以 运行 您的 "exit" 代码。我想一个事件处理程序可以像这样用 x86 程序集编写:

start:
  int 10, onctrlc ; register handler for made up event
  ; ... more instructions evaluate right after
onctrlc:
  ; control+c pressed, now exit

但我不只是考虑 CTRL+C,而是考虑任何事件(我不太了解)。我看到了这个 tiny event loop lib in C,不确定是否可以使用简单的汇编指令来完成。诸如键盘事件、套接字事件、文件事件之类的事件,我不确定它们是什么。

此外,这将是 运行 作为操作系统上的普通用户。但是知道如何为特权用户做这件事会很高兴。而且也不关心如何使用 linux C 函数或系统调用来完成它,到目前为止我知道如何这样做。

做你想做的事情的基本指令是暂停。它停止执行指令,直到收到中断。

一个较新的类似指令是MWAIT。它像停止一样等待,但它也会在写入特定内存位置时唤醒(由不同的 CPU 内核或 I/O 设备写入)。 MWAIT 还使 CPU 处于比 halt 更低的功耗状态。 MONITOR 指令用于指定将导致 MWAIT 唤醒的内存位置。

您提到的其他类型的事件是软件构造。 CPU 指令不知道键盘、文件或网络设备。

MWAIT 和 HALT 是特权指令。如果应用程序想让 CPU 进入休眠状态,它通常需要调用 OS,因此 OS 可以安排其他进程,如果有进程准备好 运行.

虽然有执行此操作的说明,但它们对操作系统下的进程 运行 没有用,因为您不能使用它们。你也没有办法利用中断。 相反,使用系统调用和信号来实现预期的目标。有用的系统调用是:

  • nanosleep 将进程停止指定的纳秒数。
  • sigactionsignal 配置接收到信号时发生的情况。
  • pause 暂停进程,直到收到信号。

在类似 UNIX 的系统上,例如 Linux,当用户按下 Ctrl + 时,SIGINT 会传送到您的进程C。此行为可用于实现所需的结果。

我建议您先在 C 中练习所有这些概念,然后再深入到汇编实现中。