CaptainBiken 发表于 2023-8-29 10:51:28

android读时间戳

本帖最后由 CaptainBiken 于 2023-8-29 11:02 编辑

#ifdef __linux__
// GCC
void InternalSource::entropy_read_timestamp(unsigned long long* out) {
        unsigned int re = { 0 };
        asm("RdTSC\nmov %0, %%eax\n" : "=r" (re));
        asm("mov %0, %%edx\n" : "=r" (re));
        *out = *(unsigned long long*)re;
}
#elif defined(_M_IX86)
// VisualStudio
void InternalSource::entropy_read_timestamp(uint64_t* out) {
        uint64_t re = 0;
        _asm {
                RdTSC
                mov DWORD PTR re, eax
                mov DWORD PTR, edx
        }
        *out = re;
}
#endif

求助以上代码的功能,以及如何改写使之能够在android上实现

更新:环境为Mac系统AS里的ARM模拟器

isdkz 发表于 2023-8-29 10:51:29

以上代码的功能是读取时间戳。根据不同的操作系统,使用不同的汇编指令来实现。

在Linux环境下,使用GCC编译器,通过RdTSC指令读取时间戳,并将结果存储在re数组中。然后通过指针转换将re数组的值赋给*out。

在Windows环境下,使用VisualStudio编译器,通过RdTSC指令读取时间戳,并将结果存储在re变量中。然后通过汇编指令将re的低32位和高32位分别存储到eax和edx寄存器中,最后将re的值赋给*out。

要在Android上实现相同的功能,需要使用适当的汇编指令来读取时间戳。由于Android是基于Linux内核的,可以使用与Linux环境下相同的代码来实现。

以下是在Android上实现的修改后的代码:

void entropy_read_timestamp(uint64_t* out) {
    uint32_t re = { 0 };
    asm volatile("RdTSC\nmov %0, %%eax\n" : "=r" (re));
    asm volatile("mov %0, %%edx\n" : "=r" (re));
    *out = *((uint64_t*)re);
}


这段代码将时间戳的低32位存储在re中,高32位存储在re中。然后通过指针转换将re的值赋给*out。

请注意,为了在Android上使用汇编指令,需要确保编译器和平台支持内联汇编。另外,由于Android设备使用的是ARM架构,所以需要根据具体的架构进行调整。以上代码适用于x86架构的模拟器或设备。如果是ARM架构的设备,需要使用适当的ARM汇编指令来读取时间戳。

CaptainBiken 发表于 2023-8-29 10:56:41

本帖最后由 CaptainBiken 于 2023-8-29 10:59 编辑

isdkz 发表于 2023-8-29 10:52
以上代码的功能是读取时间戳。根据不同的操作系统,使用不同的汇编指令来实现。

在Linux环境下,使用GCC ...

大佬你好,我是用的Mac系统AS里的ARM架构模拟器,请问应该如何改写
页: [1]
查看完整版本: android读时间戳