我正在使用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
答案 0 :(得分: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弃用gettimeofday
,而推荐使用clock_gettime
(具有秒/纳秒的时间结构),因此您可能要改用它。