2015-11-19 10 views
5
#include <stdio.h> 

int main(){ 
     __asm__ (
       "result: \n\t" 
       ".long 0 \n\t" 
       "rdtsc  \n\t" 
       "movl %eax, %ecx\n\t" 
       "rdtsc  \n\t" 
       "subl %ecx, %eax\n\t" 
       "movl %eax, result\n\t" 
     ); 

     extern int result; 
     printf("%d\n", result); 
} 

assembler değişkeni geçen. Mümkün mü? Assembler kodum Segmentation fault (core dumped) neden olur. Ubuntu 15.10 x86_64, gcc 5.2.1 kullanıyorum.I <code>result</code> değişkeni ile <code>main</code> assembler bazı veri geçmek istiyorum Cı

+0

GCC size başvurmak için izin (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html) Bunun için, [Genişletilmiş ASM] vardır __asm__' parçasındaki bir çıkış değişkenine. –

+2

Buna eklemek için: kod, programın kod segmentinde 'result' için yer ayırır ve' .long 0', iki 'add% al, (% rax)' talimatlarını üretir. –

+0

Saati okumak istiyorsanız, sadece neden imzasız uzun uzun değil a = __builtin_ia32_rdtsc() '? O zaman bir asm yazman gerekmez. –

cevap

1

Daha iyi bir yaklaşım olabilir:

int main (void) 
{ 
    unsigned before, after; 

    __asm__ 
    (
     "rdtsc\n\t" 
     "movl %%eax, %0\n\t" 
     "rdtsc\n\t" 
     : "=rm" (before), "=a" (after) 
     : /* no inputs */ 
     : "edx" 
    ); 

    /* TODO: check for after < before in case you were unlucky 
    * to hit a wraparound */ 
    printf("%u\n", after - before); 
    return 0; 
} 
İlgili konular