如何在FreeBSD的内联程序中调用gettimeofday系统调用?

问题描述 投票:1回答:1

我试图在 FreeBSD 5.2.1 32-bit 中使用 syscalls 和 inline assembly 来获取当前时间。

我的问题是,我很难将所需的结构作为参数传递给函数,导致错误。

error: impossible register constraint in `asm'

我目前实际运行的代码是这样的。

#include <sys/syscall.h>
#include <sys/time.h>

struct timeval val;
struct timezone zone;

zone.tz_minuteswest = 0;
zone.tz_dsttime = 0;

long ret;

asm("int $0x80"
    : "=a"(ret)
    : "0"(SYS_gettimeofday), "D"(val), "S"(zone)
    : "memory");

我试图从这2个例子中得到启发,但我无法让它工作起来。链接1, 链接2.

我唯一能做的事情就是,调用系统调用,如 getuid因为它不需要参数,直接返回值。

我愿意使用 clock_gettime syscall,但除此之外,我还想使用内联汇编的syscalls来获取当前时间。

gcc x86 system-calls freebsd inline-assembly
1个回答
1
投票

谢谢大家在评论中的帮助。

解决的问题是

  • 传递指针而不是值
  • 使用 纠正 传递参数的惯例 (x86-32 FreeBSD)

代码。

#include <sys/syscall.h>
#include <sys/time.h>

struct timeval val;
struct timezone zone;

zone.tz_minuteswest = 0;
zone.tz_dsttime = 0;

unsigned int ret;

asm volatile(
  "push %3;"
  "push %2;"
  "push $0;"
  "int $0x80"
  "add $12, %%esp"
  : "=a"(ret)
  : "a"(SYS_gettimeofday), "r"(&val), "r"(&zone)
  : "memory");

E:根据意见建议优化代码。

© www.soinside.com 2019 - 2024. All rights reserved.