3

我正在尝试使用 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

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

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

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

提前致谢

4

1 回答 1

7

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

此外,由于您使用的是 64 位架构,因此 64 位结果应该rax以.eaxebx

最后我建议而不是使用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。这些cpuid指令是为了防止处理器围绕分析点重新排序指令。

于 2012-09-29T17:09:39.550 回答