1

我正在使用 64 位代码通过 syscall 指令调用 gettimeofday。

我无法得到任何结果,并且通过 Dtrace 被告知调用没有错误,但我从调用中返回的寄存器是垃圾。

我执行以下操作:

lea rdi, [rel timeval]   ;buffer for 16bytes
mov rsi, 0               ;no need of timezone
mov rax, 0x2000074       ;gettimeofday
syscall

返回时 rax 既不是 0 也不是 -1,并且缓冲区永远不会获取任何数据。

请有人检查一下,看看他们是否能接到工作电话。我不知道发生了什么事。

此致

克里斯

ps 这是我刚刚尝试过的示例代码,它只返回 0。

    SECTION .text

    global _main
_main:
    lea rdi, [rel buffer]
    mov rsi, 0
    mov rax, 0x2000074
    syscall

    mov rdi, [rel buffer]
    mov rax, 0x2000001
    syscall

    SECTION .data
buffer:
    times 16 db 0
4

1 回答 1

0

根据 API,您需要指出:

1) RDI 到 timeval 结构:

_STRUCT_TIMEVAL
{
    __darwin_time_t         tv_sec;         /* seconds */
    __darwin_suseconds_t    tv_usec;        /* and microseconds */
};

DarwinTime 是一个 QWORD,而 DarwinSuSeconds 是一个 DWORD。

2) RSI 到时区结构。
如果您不喜欢它的输出,只需将其指向 2xQWORD 暂存缓冲区即可。

3) RDX 到mach_absolute_time结构
这是一个 1xQWORD 缓冲区

将上述 RSI、RDX、RDI 中的任何一个设置为 0x0 而不是指针可能会被拒绝,因为它可能会触发内部异常。(检查返回值是否为-EFAULT。)


另请注意,POSIX 不赞成使用gettimeofdayclock_gettime它具有秒/纳秒时间结构),因此您可能希望改用它。

于 2018-09-18T03:47:18.540 回答