我试图在 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来获取当前时间。
谢谢大家在评论中的帮助。
解决的问题是
代码。
#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:根据意见建议优化代码。