本帖最后由 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汇编指令来读取时间戳。
|