我试图使用rdtsc函数,但我得到了奇怪的数字。我试图从C代码中调用这个函数,并将勾号返回给函数。你能告诉我我做得对不对吗?
Asm代码:
.text
.globl czas
.type czas, @function
czas:
pushq %rbp
movq %rsp, %rbp
xor %rax,%rax;
cpuid
rdtsc
popq %rbp
ret
C代码:
unsigned long long Czas;
Czas=czas();
rdtsc
在edx
:eax
中返回结果,即使在64位模式下也是如此,但C调用约定期望在rax
中返回结果。你必须自己把结果打包。请注意,您通常不需要堆栈框架。类似于:
cpuid
rdtsc
shl $32, %rdx
or %rdx, %rax
ret
函数的类型是什么?它应该是UINT64。CCD_ 5返回EAX中的低32位和EDX寄存器中的高32位。所以你不会导致RAX而不是执行:
shl rdx, 32 //left shift for 32 bits
or rax, rdx //Compose both registers in 64 bit RAX
执行CCD_ 6指令后。