鱼C论坛

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

[已解决]android读时间戳

[复制链接]
发表于 2023-8-29 10:51:28 | 显示全部楼层 |阅读模式
15鱼币
本帖最后由 CaptainBiken 于 2023-8-29 11:02 编辑
  1. #ifdef __linux__
  2. // GCC
  3. void InternalSource::entropy_read_timestamp(unsigned long long* out) {
  4.         unsigned int re[2] = { 0 };
  5.         asm("RdTSC\nmov %0, %%eax\n" : "=r" (re[0]));
  6.         asm("mov %0, %%edx\n" : "=r" (re[1]));
  7.         *out = *(unsigned long long*)re;
  8. }
  9. #elif defined(_M_IX86)
  10. // VisualStudio
  11. void InternalSource::entropy_read_timestamp(uint64_t* out) {
  12.         uint64_t re = 0;
  13.         _asm {
  14.                 RdTSC
  15.                 mov DWORD PTR re, eax
  16.                 mov DWORD PTR[re + 4], edx
  17.         }
  18.         *out = re;
  19. }
  20. #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上实现的修改后的代码:

  1. void entropy_read_timestamp(uint64_t* out) {
  2.     uint32_t re[2] = { 0 };
  3.     asm volatile("RdTSC\nmov %0, %%eax\n" : "=r" (re[0]));
  4.     asm volatile("mov %0, %%edx\n" : "=r" (re[1]));
  5.     *out = *((uint64_t*)re);
  6. }
复制代码


这段代码将时间戳的低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上实现的修改后的代码:

  1. void entropy_read_timestamp(uint64_t* out) {
  2.     uint32_t re[2] = { 0 };
  3.     asm volatile("RdTSC\nmov %0, %%eax\n" : "=r" (re[0]));
  4.     asm volatile("mov %0, %%edx\n" : "=r" (re[1]));
  5.     *out = *((uint64_t*)re);
  6. }
复制代码


这段代码将时间戳的低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-4-28 22:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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