Я пытаюсь вычислить количество циклов ЦП, необходимых для запуска одной инструкции ASM.Для этого я создал эту функцию:
measure_register_op:
# Calculate time of required for movl operation
# function setup
pushl %ebp
movl %esp, %ebp
pushl %ebx
pushl %edi
xor %edi, %edi
# first time measurement
xorl %eax, %eax
cpuid # sync of threads
rdtsc # result in edx:eax
# we are measuring instuction below
movl %eax, %edi
# second time measurement
cpuid # sync of threads
rdtsc # result in edx:eax
# time difference
sub %eax, %edi
# move to EAX. Value of EAX is what function returns
movl %edi, %eax
# End of function
popl %edi
popl %ebx
mov %ebp, %esp
popl %ebp
ret
Я использую ее в файле * .c:
extern unsigned int measure_register_op();
int main(void)
{
for (int a = 0; a < 10; a++)
{
printf("Instruction took %u cycles \n", measure_register_op());
}
return 0;
}
Проблема в том, что значения, которые я вижуслишком велики.Я получаю 3684414156
сейчас.Что может пойти не так?
РЕДАКТИРОВАТЬ: Изменен с EBX на EDI, но результат все еще похож.Это должно быть что-то с самим rdtsc.В отладчике я вижу, что результаты второго измерения с 0x7f61e078 и первым 0x42999940, который после вычитания все еще дает около 1019758392
РЕДАКТИРОВАТЬ: Вот мой make-файл.Возможно, я неправильно его компилирую:
compile: measurement.s measurement.c
gcc -g measurement.s measurement.c -o ./build/measurement -m32
РЕДАКТИРОВАТЬ: Вот точный результат, который я вижу:
Instruction took 4294966680 cycles
Instruction took 4294966696 cycles
Instruction took 4294966688 cycles
Instruction took 4294966672 cycles
Instruction took 4294966680 cycles
Instruction took 4294966688 cycles
Instruction took 4294966688 cycles
Instruction took 4294966696 cycles
Instruction took 4294966688 cycles
Instruction took 4294966680 cycles