Tôi luôn đọc những điều về cách các chức năng nhất định trong ngôn ngữ lập trình C được tối ưu hóa bằng cách được viết trong assembly. Hãy để tôi xin lỗi nếu câu đó có vẻ hơi sai lầm.Mã C gọi mã lắp ráp (ví dụ: strlen được tối ưu hóa) như thế nào?
Vì vậy, tôi sẽ nói rõ ràng: Làm thế nào khi bạn gọi một số chức năng như strlen trên hệ thống UNIX/C, chức năng thực tế bạn đang gọi được viết bằng assembly? Bạn có thể viết assembly ngay vào chương trình C bằng cách nào đó hay nó là một tình huống gọi bên ngoài? Nó là một phần của tiêu chuẩn C để có thể làm điều này, hoặc nó là một hệ điều hành cụ thể điều?
Một trong những phần thông tin quan trọng nhất bạn cần là mô tả về cách trình biên dịch C của bạn chuyển các đối số và trả về địa chỉ cho một chương trình con. Điều này được gọi là "quy ước gọi điện" cho máy hoặc bộ xử lý đó. Ví dụ, nó là điển hình trên x86 để truyền các đối số và trả về địa chỉ bằng cách sử dụng ngăn xếp. Điều này chỉ có thể làm việc cho các hàm đối số biến nếu các đối số được đẩy vào ngăn xếp theo thứ tự từ phải sang trái, sau đó địa chỉ trả về được đẩy. Nếu bạn viết chức năng ngôn ngữ lắp ráp của bạn để mong đợi bố cục ngăn xếp này ("bản ghi kích hoạt"), thì chỉ quan trọng là ... –
... thực hiện bổ sung là chức năng asm của bạn, sau khi được lắp ráp và liên kết, được gán một địa chỉ phân đoạn mã chương trình của bạn. Do đó, mã C của bạn có thể truyền thực thi bộ xử lý đến địa chỉ này của hàm asm của bạn. Tại thời điểm đó, miễn là chức năng của bạn thực hiện đúng với thanh ghi (một số phải được giữ nguyên cho người gọi, chẳng hạn như EBP), biết cách tìm đối số và trả về địa chỉ trên ngăn xếp và trả về kết quả của nó ở đúng vị trí (Giá trị trả về 32 bit có trong EAX trên x86), sau đó không có gì về việc loại bỏ giá trị đó. –