【问题标题】:Use rdtsc function in Assembly在汇编中使用 rdtsc 函数
【发布时间】:2012-09-29 16:50:33
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: assembly profiling rdtsc


    【解决方案1】:

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

    此外,由于您使用的是 64 位架构,因此 64 位结果应该以 rax 结尾,您应该确保您正在查看它,而不是 eaxebx

    最后,我建议您使用汇编指令rdtsc,而不是使用clock。这将在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 指令用于防止处理器围绕分析点重新排序指令。

    【讨论】:

    • 我已经尝试过您建议的方式,但由于操作码操作数内存错误,我不得不进行一些修改。首先,我尝试让添加指令添加 edx,eax,然后添加 rdx,rax,因为具有不同大小的操作数会产生错误。我分别进入了 rdx xa5e996bc 和 2c4b89fe072。如果我将您的指令放在简单的异或和赋值指令之间,它们的价值不是太高了吗?哪个是正确的?我会说带有 eax,edx 的那个,但在我看来这个数字还是太高了
    • 您对汇编代码中的错误是正确的。我已对其进行了更正,使其首先清除rax,然后添加整个rax,而不仅仅是eax。你不能只做add eax, edx,因为进位不会正确传播。如果您正确执行此操作,那么rdx 中的结果应该是一个相对较小的数字。确保您没有在中间的代码中破坏 rcx
    • 对不起,我可能没有做对。我完全按照你写的做了,我在 rdx 中得到了 1000 000 000 000 000 的数字。
    • ...当我注意到 rcx 被第二个 cpuid 指令破坏时,我试图在第二个 cpuid 之前将其推送并在 sub 指令之前弹出它以使用旧值进行减法.在这种情况下,我得到了 22 000 000 000 的数量,如果我正确理解我在做什么,这意味着在 2.86 GHz cpu 上,整个过程大约需要 10 秒。事实上,我的过程需要眨眼的时间。再次抱歉,但我对这种行为感到很困惑,我不确定我做得对......
    • 我不确定。我建议您发布一个最小但完整的示例作为一个新问题。这将使人们更容易看到。如果事实证明这个答案中的代码有问题,我会编辑它,或者你可以。
    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 2010-10-29
    • 2021-11-11
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多