2015-11-19 17 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); 
} 

Tôi muốn chuyển một số dữ liệu từ assembly đến main qua biến số result. Điều này có thể không? Mã lắp ráp của tôi gây ra một số Segmentation fault (core dumped). Tôi đang sử dụng Ubuntu 15.10 x86_64, gcc 5.2.1.Chuyển biến từ trình biên dịch sang C

+0

GCC có [ASM Extended] (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html) cho việc này, cho phép bạn tham khảo vào một biến đầu ra trong đoạn '__asm__' đó. –

+2

Để thêm vào đó: mã khi nó phân bổ không gian cho 'kết quả' trong phân đoạn mã của chương trình, và' .long 0' tạo ra hai lệnh 'add% al, (% rax)'. –

+0

Nếu bạn muốn đọc đồng hồ, tại sao không chỉ sử dụng 'unsigned long long a = __builtin_ia32_rdtsc()'? Sau đó, bạn không cần phải viết bất kỳ asm. –

Trả lời

1

Một cách tiếp cận tốt hơn có thể là:

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; 
} 
Các vấn đề liên quan