2013-04-14 40 views
7

Tôi đang đi viết một thư viện thay thế trọng lượng nhẹ libc để tôi có thể hiểu rõ hơn về giao diện ứng dụng hạt nhân. Nhiệm vụ đầu tiên rõ ràng là nhận được một số trình bao bọc gọi hệ thống tại chỗ. Tôi đã thành công có 1 đến 3 đối số wrappers làm việc nhưng tôi đang đấu tranh với một đối số 4 varient. Dưới đây là điểm khởi đầu của tôi:Hạn chế đăng ký r10 trong gcc inline x86_64 assembly

long _syscall4(long type, long a1, long a2, long a3, long a4) 
{ 
    long ret; 
    asm 
    (
     "syscall" 
     : "=a"(ret) 
     : "a"(type), "D"(a1), "S"(a2), "d"(a3), "r10"(a4) 
     : "c", "r11" 
    ); 
    return ret; 
} 

Trình biên dịch mang lại cho tôi những lỗi sau:

error: matching constraint references invalid operand number 

chức năng _syscall3 tôi hoạt động tốt nhưng doesnt r10 sử dụng hoặc có một danh sách clobber.

Mọi suy nghĩ?

Trả lời

0

Có lẽ vì không có hướng dẫn nào có yêu cầu cụ thể cho đăng ký r10, các folks gcc không tạo ra một ràng buộc cho nó (do ràng buộc chủ yếu cho các mô tả máy). Nếu bạn nhấn mạnh vào nội tuyến asm tôi không nghĩ rằng bạn có thể làm tốt hơn việc sử dụng một ràng buộc chung "r" (hoặc "m") và di chuyển vào r10 chính mình (và thêm nó vào danh sách clobber).

5

Không có ràng buộc đối với thanh ghi: %r8 .. %15. Tuy nhiên, gần đây (như trong gcc-4.x) nên chấp nhận:

register long r10 asm("r10") = a4; 

sau đó sử dụng các hạn chế đầu vào: "r" (r10)

này có thể yêu cầu __asm__ được đủ điều kiện với __volatile__ - Tôi đang chạy tắt bộ nhớ ở đây, vì vậy tôi không thể nói cho bạn biết khi nào cú pháp này được thực hiện chính thức, v.v ... Đó là một sự tái chế hợp lý của từ khóa register không có ích khác.

+2

Mẹo hay. Đây là một tính năng tuyệt vời mà thực sự giúp thiết lập lắp ráp nội tuyến GCC ngoài. Đây là tài liệu liên quan: https://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html – linguamachina

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