我正试图找到一种方法让我的代码等待两秒钟才能继续.我在保护模式下使用nasm for Linux,所以我只能使用int 80h.我发现了一个名为“alarm”的系统调用(27),另一个称为“暂停”(29).但是,当我尝试使用它们时,程序会等待并完成,而不是继续执行.我还发现了另一个系统调用,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