nasm汇编linux定时器或睡眠

我试图find一种方法来让我的代码等待两秒钟,然后再继续。 我在保护模式下使用Linux的nasm,所以我只能使用int 80h。 我发现了一个称为“ alarm ”(27)的syscall调用,另一个叫做“ pause ”(29)。 但是,当我尝试使用这些,程序等待并结束,而不是继续执行。 我还发现了另一个syscall ,sigaction,它改变了信号的行为(所以我认为它可以用来使程序忽略由报警产生的信号,而不是退出),但我不太了解sigaction如何工作。 谢谢你的帮助。 有用的链接: http : //man7.org/linux/man-pages/man2/alarm.2.html http://man7.org/linux/man-pages/man2/sigaction.2.html

有一个系统调用睡眠程序, sys_nanosleep

  sys_nanosleep : eax = 162, ebx = struct timespec *, ecx = struct timespec * 

这个struct timespec结构有两个成员:

 tv_sec ; 32 bit seconds tv_nsec ; 32 bit nanoseconds 

这个结构可以在nasm中声明为:

 section .data timeval: tv_sec dd 0 tv_usec dd 0 

然后设置值并将其称为:

 mov dword [tv_sec], 5 mov dword [tv_usec], 0 mov eax, 162 mov ebx, timeval mov ecx, 0 int 0x80 

该程序然后将睡5秒。 一个完整的例子:

 global _start section .text _start: ; print "Sleep" mov eax, 4 mov ebx, 1 mov ecx, bmessage mov edx, bmessagel int 0x80 ; Sleep for 5 seconds and 0 nanoseconds mov dword [tv_sec], 5 mov dword [tv_usec], 0 mov eax, 162 mov ebx, timeval mov ecx, 0 int 0x80 ; print "Continue" mov eax, 4 mov ebx, 1 mov ecx, emessage mov edx, emessagel int 0x80 ; exit mov eax, 1 mov ebx, 0 int 0x80 section .data timeval: tv_sec dd 0 tv_usec dd 0 bmessage db "Sleep", 10, 0 bmessagel equ $ - bmessage emessage db "Continue", 10, 0 emessagel equ $ - emessage 

有了NASM,如果你的目标是Linux x86-64,你可以简单地做类似下面的事情:

 global _start section .data timespec: tv_sec dq 1 tv_nsec dq 200000000 section .text _start: mov rax, 35 mov rdi, timespec xor rsi, rsi syscall ... 

35对应于sys_nanosleep的64位系统调用号(如此处所列)。 如果通话中断,则将剩余的睡眠时间写入寄存器rsi指向的内存位置; 在这个例子中,如果rsi被设置为0,忽略该值。 这个调用将在tv_sec秒+ tv_nsec纳秒 ,在上面的代码段中为1.2秒。

有关此系统调用的更多信息可以在nanosleep手册页中找到 。