我想知道在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函数或系统调用来实现它,我知道到目前为止如何做到这一点。
做你想做的事的基本指令是HALT。它会停止执行指令,直到收到中断为止。
一个类似的新指令是MWAIT。它等待暂停,但是当写入特定的内存位置(由不同的CPU内核或I / O设备)时,它也会唤醒。 MWAIT还将CPU置于低于停止状态的低功耗状态。 MONITOR指令用于指定将导致MWAIT唤醒的内存位置。
您提到的其他类型的事件是软件构造。 CPU指令不了解键盘,文件或网络设备。
MWAIT和HALT是特权指令。如果应用程序想要让CPU进入休眠状态,它通常需要调用操作系统,因此操作系统可以安排其他一些进程,如果有一个准备运行的话。
虽然有执行此操作的说明,但它们对于在操作系统下运行的进程没有用,因为您不允许使用它们。你也没有办法利用中断。相反,使用系统调用和信号来实现所需的目标。有用的系统调用是:
nanosleep
将您的进程停止指定的纳秒数。sigaction
和signal
配置收到信号时会发生什么。pause
暂停该过程,直到收到信号。在类似UNIX的系统(如Linux)上,当用户按下Ctrl + C时,会向您的进程传递SIGINT
。此行为可用于实现所需的结果。
我建议您先进入C语言中练习所有这些概念,然后再进入装配实现。