繁体   English   中英

在Assembly中使用rdtsc函数

[英]Use rdtsc function in Assembly

我试图使用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中的数字是正确的吗? 是不是太高了?

提前致谢

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

另外,当你使用的是64位架构时,64位结果应该以rax结束,你应该确保你看到它,而不是eaxebx

最后我建议你不要使用clock你应该使用汇编程序指令rdtsc 这将在edx:eax返回64位结果。 它是相对的而不是绝对的,是以周期而不是几分之一秒来衡量的,但它应该是你需要进行分析的。

例:

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中经过的滴答数。 cpuid指令用于防止处理器重新排序分析点周围的指令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM