在Assembly中使用rdtsc函数

时间:2012-09-29 16:50:34

标签: 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

在调试器中运行它在子指令之后的寄存器中得到以下结果:

rax     0xd88102bc
rbx     0x0
rcx     0xf0
rdx     0x44f3914a0
rsi     0x13
rdi     0x1
rbp     0x0
rsp     0x7fffffffdf38
r8      0x11828947ee1c

我无法弄清楚为什么rdx中的周期数对于这么简单的指令来说是如此之高。 rcx中的数字是正确的吗?是不是也太高了?

提前致谢

1 个答案:

答案 0 :(得分:7)

我不确定发生了什么,但是当你从汇编程序调用C函数时,通常应该在它们前面添加前导下划线,例如call _clock。这是因为C编译器会将此前缀添加到它生成的所有函数中。

此外,当您使用的是64位架构时,64位结果最终应该位于rax,您应该确保看到它,而不是eax和{{1} }。

最后我建议您使用汇编程序指令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 中经过的滴答数。 rdx指令旨在防止处理器重新排序分析点周围的指令。