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

デバッガーで実行すると、サブ命令の後のレジスターで次の結果が得られます。

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 に答える