鱼C论坛

 找回密码
 立即注册
查看: 1278|回复: 2

[已解决]android读时间戳

[复制链接]
发表于 2023-8-29 10:51:28 | 显示全部楼层 |阅读模式
15鱼币
本帖最后由 CaptainBiken 于 2023-8-29 11:02 编辑
#ifdef __linux__
// GCC
void InternalSource::entropy_read_timestamp(unsigned long long* out) {
        unsigned int re[2] = { 0 };
        asm("RdTSC\nmov %0, %%eax\n" : "=r" (re[0]));
        asm("mov %0, %%edx\n" : "=r" (re[1]));
        *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[re + 4], edx
        }
        *out = re;
}
#endif

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

更新:环境为Mac系统AS里的ARM模拟器
最佳答案
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[2] = { 0 };
    asm volatile("RdTSC\nmov %0, %%eax\n" : "=r" (re[0]));
    asm volatile("mov %0, %%edx\n" : "=r" (re[1]));
    *out = *((uint64_t*)re);
}

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

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

最佳答案

查看完整内容

以上代码的功能是读取时间戳。根据不同的操作系统,使用不同的汇编指令来实现。 在Linux环境下,使用GCC编译器,通过RdTSC指令读取时间戳,并将结果存储在re数组中。然后通过指针转换将re数组的值赋给*out。 在Windows环境下,使用VisualStudio编译器,通过RdTSC指令读取时间戳,并将结果存储在re变量中。然后通过汇编指令将re的低32位和高32位分别存储到eax和edx寄存器中,最后将re的值赋给*out。 要在Android上实现相同 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[2] = { 0 };
    asm volatile("RdTSC\nmov %0, %%eax\n" : "=r" (re[0]));
    asm volatile("mov %0, %%edx\n" : "=r" (re[1]));
    *out = *((uint64_t*)re);
}

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

请注意,为了在Android上使用汇编指令,需要确保编译器和平台支持内联汇编。另外,由于Android设备使用的是ARM架构,所以需要根据具体的架构进行调整。以上代码适用于x86架构的模拟器或设备。如果是ARM架构的设备,需要使用适当的ARM汇编指令来读取时间戳。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-29 10:56:41 | 显示全部楼层
本帖最后由 CaptainBiken 于 2023-8-29 10:59 编辑
isdkz 发表于 2023-8-29 10:52
以上代码的功能是读取时间戳。根据不同的操作系统,使用不同的汇编指令来实现。

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


大佬你好,我是用的Mac系统AS里的ARM架构模拟器,请问应该如何改写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 01:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表