如果 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
将进程停止指定的纳秒数。
sigaction
和 signal
配置接收到信号时发生的情况。
pause
暂停进程,直到收到信号。
在类似 UNIX 的系统上,例如 Linux,当用户按下 Ctrl + 时,SIGINT
会传送到您的进程C。此行为可用于实现所需的结果。
我建议您先在 C 中练习所有这些概念,然后再深入到汇编实现中。
我想知道 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
将进程停止指定的纳秒数。sigaction
和signal
配置接收到信号时发生的情况。pause
暂停进程,直到收到信号。
在类似 UNIX 的系统上,例如 Linux,当用户按下 Ctrl + 时,SIGINT
会传送到您的进程C。此行为可用于实现所需的结果。
我建议您先在 C 中练习所有这些概念,然后再深入到汇编实现中。