nasm汇编linux计时器或睡眠

rvc*_*cam 3 linux assembly sleep timer nasm

我正试图找到一种方法让我的代码等待两秒钟才能继续.我在保护模式下使用nasm for Linux,所以我只能使用int 80h.我发现了一个syscall名为" alarm"(27)和另一个名为" pause"(29).但是,当我尝试使用它们时,程序会等待并完成而不是继续执行.我还发现了另一个syscallsigaction,它改变了信号的行为(所以我认为它可以用来让程序忽略由alarm而不是退出产生的信号)但是我不太明白sigaction是如何工作的.谢谢你的帮助.有用的链接:http ://man7.org/linux/man-pages/man2/alarm.2.html http://man7.org/linux/man-pages/man2/sigaction.2.html

小智 6

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

 sys_nanosleep : eax = 162, ebx = struct timespec *, ecx = struct timespec *
Run Code Online (Sandbox Code Playgroud)

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

tv_sec   ; 32 bit seconds
tv_nsec  ; 32 bit nanoseconds
Run Code Online (Sandbox Code Playgroud)

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

section .data

  timeval:
    tv_sec  dd 0
    tv_usec dd 0
Run Code Online (Sandbox Code Playgroud)

然后设置值并将其命名为:

mov dword [tv_sec], 5
mov dword [tv_usec], 0
mov eax, 162
mov ebx, timeval
mov ecx, 0
int 0x80
Run Code Online (Sandbox Code Playgroud)

程序然后会睡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
Run Code Online (Sandbox Code Playgroud)