linux - nasm 汇编 linux 计时器或 sleep

标签 linux assembly timer sleep nasm

我正试图找到一种方法让我的代码在继续之前等待两秒钟。我在保护模式下使用 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结构有两个成员:

 ;; This is for 32-bit.  Note that x86-64 uses 2x 64-bit members
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

关于linux - nasm 汇编 linux 计时器或 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19580282/

相关文章:

linux - 如何在 Linux Bash 中获取命令输出的一部分?

assembly - 64 位模式下的地址覆盖前缀

gcc - 如何测量处理器周期中的 x86 和 x86-64 汇编命令执行时间?

assembly - 如何将 ASM 转换为可读代码?

linux - 如何SVN提交具有相同前缀的所有文件

linux - 使用 awk 搜索模式并从日志文件中打印接下来的 15 行

linux - 每个月运行 cron 作业并且命令的结果需要在一个文件中

java - 事务中未到达finally{timer.cancel();}

c# - 机器人计时器

java - 如何在android studio中停止计时器,然后从停止时重新开始?