我正在使用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,缓冲区从不获取任何数据。
请有人检查一下,看看他们是否能接到工作电话。我不知道发生了什么事。
致以最诚挚的问候
Chris
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 */
};
达尔文时间是QWORD,达尔文秒是DWORD。
2) RSI到时区结构
如果您不喜欢它的输出,只需将其指向2xQWORD暂存缓冲区即可。
3) RDX到mach_absolute_time
结构
这是一个1xQWORD缓冲
将上述RSI、RDX、RDI中的任何一个设置为0x0而不是指针可能会被拒绝,因为它可能会触发内部异常。(检查返回值是否为-EFAULT
。)
还要注意,POSIX反对gettimeofday
而支持clock_gettime
(它有一个秒/纳秒的时间结构),所以您可能需要使用它。