函数 __asm__ __volatile__( "rdtsc" );
Function __asm__ __volatile__("rdtsc");
我不知道这个代码到底是什么:
int rdtsc(){
__asm__ __volatile__("rdtsc");
有人能解释一下吗?为什么是"rdtsc"?
实际上,这根本不是很好的代码。
RDTSC
是x86指令"ReaD TimeStamp Counter",它读取一个64位计数器,该计数器在处理器的每个时钟周期进行计数。
但由于它是一个64位的数字,它存储在EAX
(低位(和EDX
(高位(中,如果在内联的情况下使用此代码,编译器就不知道EDX
正在被破坏。或者内联程序集在从非void
函数的末尾脱落之前设置EAX。
编译器不"理解"汇编代码,它是一个黑盒,必须用输入/输出操作数来描述,这样它才能知道EDX:EAX
中有输出。(或者EAX
中的输出,其中EDX
被重击(。我会这样做:
uint64_t rdtsc()
{
uint32_t hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (uint64_t)lo)|( ((uint64_t)hi)<<32 );
}
因此给出了一个时间计数,它不会在现代机器上每隔一秒钟或两秒钟进行一次,并且它告诉注册asm
语句修改的编译器。
或者使用__rdtsc()
内在函数让编译器发出rdtsc
指令本身,并知道输出在哪里。请参阅获取CPU周期计数?。
rdtsc
的常被引用的内联程序集使用gcc-7和早期版本生成了出色的代码。
更有效的解决方案是使用__builtin_ia32_rdtsc
内置功能:
uint64_t tsc = __builtin_ia32_rdtsc();
相关文章:
- 使用rdtsc进行基准测试的缺点是什么
- 使用C++获取程序的 ASM
- 在 c++ 中使用 x86 DIV 的这个 asm 块有什么用?
- g++ -O3 为 loop 创建了奇怪的指令 - 两个具有相同 asm 的版本
- Extern "C"错误在'int'之前'asm'或'__attribute__'
- 了解 C/C++ 中 Windows / MSVC 的一些反调试内联 asm
- 尝试使用 x86 asm SSSE3 将大端转换为小端序
- 如何使用"asm volatile"编写 btr 指令
- objdump 不显示机器代码,但显示 ASM
- 未使用的 asm() 在不受支持的体系结构上的行为
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 为什么发出空asm命令会交换变量
- C++-更改另一个文件的ASM指令
- 尝试用纯 c 编程 arduino,得到以下错误:预期的"="、""、";",'asm'或"打印"之前的'__attribute__'|
- C++/ASM:按值传递使用 xmm0,但按引用使用 rdi
- 有人知道可以使用 c++ 以字节为单位编码 asm 字符串的任何东西吗?
- 优化了 VC++ 和 ASM 中的代码
- 如何在 Linux asm 中正确返回双精度值
- 使用读取[EBP 4]的MSVC内联ASM移植到64位