2009-11-04 36 views
6

Tôi đang cố gắng hiểu mã lắp ráp nội tuyến này xuất phát từ _hypercall0here.% c có nghĩa là gì trong mã lắp ráp nội tuyến GCC?

asm volatile ("call hypercall_page+%c[offset]" \ 
     : "=r" (__res) \ 
     : [offset] "i" (__HYPERVISOR_##name * sizeof(hypercall_page[0])) \ 
     : "memory", "edi", "esi", "edx", "ecx", "ebx", "eax") 

Tôi đang gặp khó khăn khi tìm thông tin về những gì %c trong dòng đầu tiên có nghĩa là. Tôi không tìm thấy bất kỳ thông tin nào trong phần rõ ràng nhất của số GCC manual, giải thích %[name], nhưng không phải là %c[name]. Có chỗ nào khác mà tôi nên xem không?

Trả lời

12

Từ GCC internals documentation:

`% c chữ số 'có thể được sử dụng để thay thế một toán hạng đó là một giá trị không đổi mà không có cú pháp thường cho biết một toán hạng ngay lập tức.

2

Kiểm tra đầu ra lắp ráp (với gcc -S hoặc có thể tháo rời tệp đối tượng) và có thể rõ ràng hơn.

Tôi đoán là viết tắt của hằng số. hypercall_page trông giống như một bảng chỉ dẫn mà mỗi người làm một syscall. Có lẽ điều này sẽ tạo ra một call hypercall_page + {constant based on the expression given}, về cơ bản có tính toán địa chỉ của bù đắp này tại thời gian biên dịch.

Là một sang một bên, thứ __HYPERVISOR##name điều này thực sự làm tôi nhớ đến ước __NR_name_of_syscall loại bạn xem cho syscalls trong <asm/unistd.h> và tương tự như nơi Linux.

Các vấn đề liên quan