Я пытаюсь подсчитать, используя rdtsc, сколько циклов требуется, чтобы написать что-то, используя sys_write. Я смог протестировать функции printf и scanf. Они работали правильно, и теперь у меня проблема с системными вызовами.
На мой взгляд, проблема в регистрах% eax и% edx, потому что rdtsc сохраняет результат в этих регистрах.
write.s
.data
SYS_EXIT = 1
SYS_WRITE = 4
STDOUT = 1
EXIT_SUCCES = 0
text: .ascii "Hello from assembler\n"
textLength: .long . - text
.section .text
.globl print
.type print, @function
print:
movl $SYS_WRITE, %eax
movl $STDOUT, %ebx
movl $text, %ecx
movl textLength, %edx
int $0x80
ret
rdtsc.s
.data
.text
.globl rdtsc
rdtsc:
push %ebx
xor %eax, %eax
cpuid
rdtsc
pop %ebx
ret
main.c
#include <stdio.h>
unsigned long long rdtsc();
extern void print();
unsigned long long startTime, stopTime, workingTime;
int main (void)
{
startTime = rdtsc();
print();
stopTime = rdtsc();
workingTime = stopTime - startTime;
printf("Cycles %llu\n", workingTime);
return 0;
}
Когда я запускаю программу, я получаю ошибку Сегментация (ядро сброшено).