因为想尝试使用INTEL CPU的RDTSC指令来为程序计数,所以查阅了相关资料,尝试后发现GCC下使用RDTSC指令不能获得正确的结果,于是想看看C的代码编译成汇编的样子:
GCC下得这样: g++ -o main.s main.cpp -S
微软的cl编译器得这样: cl.exe /FAs main.cpp
GCC产生的汇编是AT&T格式,微软的是INTEL格式。从注释的角度说,微软的CL生成的汇编要贴心得多,源码和行号的信息都在里面,一目了然。
汇编当然是看不懂的了,比如CL中使用rdtsc,为什么指令返回的结果存放在EDX:EAX中,最后还能作为函数的返回值?看来汇编的领域,我还是个纯粹的白痴!!!进军汇编,这是我未来的一个方向。
OK,最后贴上可以同时在CL和GCC下使用的RDTSC调用的代码:

/**//// 调用INTEL CPU指令RDTSC来获得时间计数,便于得到代码段的性能指标
/// @return 64为无符号整形的CPU时钟值
unsigned long long rdtsc()

...{

#ifdef _MSC_VER /**//* msvc compiler */
__asm _emit 0x0F
__asm _emit 0x31
#else /* gcc compiler */
unsigned long long temp;
unsigned int low, high;
__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high));
temp = high;
temp <<= 32;
temp += low;
return temp;
#endif
}
GCC下得这样: g++ -o main.s main.cpp -S
微软的cl编译器得这样: cl.exe /FAs main.cpp
GCC产生的汇编是AT&T格式,微软的是INTEL格式。从注释的角度说,微软的CL生成的汇编要贴心得多,源码和行号的信息都在里面,一目了然。
汇编当然是看不懂的了,比如CL中使用rdtsc,为什么指令返回的结果存放在EDX:EAX中,最后还能作为函数的返回值?看来汇编的领域,我还是个纯粹的白痴!!!进军汇编,这是我未来的一个方向。
OK,最后贴上可以同时在CL和GCC下使用的RDTSC调用的代码:

/**//// 调用INTEL CPU指令RDTSC来获得时间计数,便于得到代码段的性能指标
/// @return 64为无符号整形的CPU时钟值
unsigned long long rdtsc()
...{
#ifdef _MSC_VER /**//* msvc compiler */
__asm _emit 0x0F
__asm _emit 0x31
#else /* gcc compiler */
unsigned long long temp;
unsigned int low, high;
__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high));
temp = high;
temp <<= 32;
temp += low;
return temp;
#endif
}
14万+

被折叠的 条评论
为什么被折叠?



