|
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模拟器
以上代码的功能是读取时间戳。根据不同的操作系统,使用不同的汇编指令来实现。
在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上实现相同 ...
|