Lui*_*rzi 3 assembly profiling rdtsc
我试图使用Ubuntu 12.04配置x86汇编程序.我想使用rdtsc函数.问题是,根据评论,我应该得到rdx中的周期数,但是使用下面的代码我得到一个太高的数字:
SECTION .bss
SECTION .dat
SECTION .text
global main
main:
nop
cpuid
rdtsc
shl rdx, 32
or rdx, rax
mov r8, rdx
xor esi,esi
mov esi,19 ; instructions to be monitored
cpuid
rdtsc
shl rdx, 32
or rdx, rax
sub rdx, r8
Run Code Online (Sandbox Code Playgroud)
在调试器中运行它我在子指令后的寄存器上得到以下结果:
rax 0xd88102bc
rbx 0x0
rcx 0xf0
rdx 0x44f3914a0
rsi 0x13
rdi 0x1
rbp 0x0
rsp 0x7fffffffdf38
r8 0x11828947ee1c
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么rdx中的循环次数如此之高以至于这么简单的指令.rcx中的数字是正确的吗?是不是太高了?
提前致谢
我不确定发生了什么,但是当你从汇编程序调用C函数时,通常应该在它们前面添加一个前导下划线call _clock.这是因为C编译器会将此前缀添加到它生成的所有函数中.
另外,当您使用的是64位架构时,64位结果应该会结束rax,您应该确保您正在查看它,而不是eax和ebx.
最后我建议而不是使用clock你应该使用汇编程序指令rdtsc.这将返回64位结果edx:eax.它是相对的而不是绝对的,是以周期而不是几分之一秒来衡量的,但它应该是你需要进行分析的.
例:
cpuid
rdtsc
shl rdx, 32
or rdx, rax
mov r8, rdx
<expensive assembler code>
cpuid
rdtsc
shl rdx, 32
or rdx, rax
sub rdx, r8
Run Code Online (Sandbox Code Playgroud)
这将留下经过的滴答数rdx.该cpuid指令是可以防止处理器重新排序围绕性能分析点说明.