我正在使用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
根据API,您需要指出:
1)RDI到时间结构:
_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弃用gettimeofday
而不是clock_gettime
(具有秒/纳秒时间结构),因此您可能希望使用它。