如果在x86程序集中有任何暂停/休眠或事件

问题描述 投票:1回答:2

我想知道在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中是否有事件挂钩/处理程序。因此,如果有人按下CTRL + C,将会有一个中断事件发送到某处的程序集,您可以在其上运行“退出”代码。我想像一个事件处理程序可以在程序集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函数或系统调用来实现它,我知道到目前为止如何做到这一点。

assembly x86-64 sleep event-loop instructions
2个回答
6
投票

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

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

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

MWAIT和HALT是特权指令。如果应用程序想要让CPU进入休眠状态,它通常需要调用操作系统,因此操作系统可以安排其他一些进程,如果有一个准备运行的话。


3
投票

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

  • nanosleep将您的进程停止指定的纳秒数。
  • sigactionsignal配置收到信号时会发生什么。
  • pause暂停该过程,直到收到信号。

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

我建议您先进入C语言中练习所有这些概念,然后再进入装配实现。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.