2009-08-18 16 views
11

Hôm qua tôi đã học được rằng việc lắp ráp nội tuyến (với từ khóa __asm) không được hỗ trợ trong Microsoft Visual C++ khi biên dịch cho các mục tiêu AMD64 và Itanium.Tại sao MSVC không hỗ trợ lắp ráp nội tuyến cho các mục tiêu AMD64 và Itanium?

Điều đó có đúng không? Và nếu có, có ai biết tại sao họ không hỗ trợ lắp ráp nội tuyến cho những mục tiêu đó không? Có vẻ như một tính năng khá lớn để chỉ cần thả ...

Trả lời

9

Chính xác, nó vẫn không được hỗ trợ trong VS 2010 Beta 1. Tôi đoán là lắp ráp nội tuyến quá khó thực hiện: cách Microsoft triển khai nó, nó tích hợp với mã C xung quanh để dữ liệu có thể chảy vào và ra khỏi mã C, và mã keo thích hợp được tự động tiêm vào. Đối với điều đó, trình biên dịch C thực sự cần phải hiểu mã trình lắp ráp; họ chưa thực hiện điều đó cho AMD64 và Itanium.

+1

Trình biên dịch C tạo ASM làm trung gian, không có gì khiến cho nó "khó" cho phép cho phép nội tuyến ASM trên AMD64. Thông số nền tảng là lý do duy nhất tại sao ASM nội tuyến không tồn tại cho các mục tiêu x86_64 trong một số trình biên dịch hỗ trợ nó cho x86. –

+0

@MarkKCowan: Bạn đã xem * ASM nội tuyến của MSVC chưa? Nó liên quan đến rất nhiều ý nghĩa của việc làm; bạn có thể tự do trộn các biến C/C++ với văn bản mã assembly, vì vậy trình biên dịch phải phân tích cú pháp và (ở một mức độ nào đó) phân tích tất cả mã, không giống cách của GCC nơi mã assembly được xác định theo kiểu gợi nhớ của printf các chuỗi định dạng và các mô tả rõ ràng về các đầu vào, đầu ra và thanh ghi clobbered sẽ làm giảm bớt bất kỳ nhu cầu nào về trình biên dịch để cố gắng phân tích lắp ráp. Thành thật mà nói, tôi thích cách tiếp cận của GCC, vì nó liên quan đến việc ít trình biên dịch hơn. – SamB

+1

@SamB yep, giống như lắp ráp nội tuyến ở Delphi. Tôi chỉ muốn GCC đã không sử dụng cú pháp AT & T: ( –

3

Nó có vẻ như một tính năng khá lớn để chỉ cần thả ...

Đó là khá dễ dàng để gọi một chức năng bằng văn bản với một nhà lắp ráp, miễn là bạn làm theo công ước C. This tutorial giải thích cách thực hiện.

+0

Đồng ý, chỉ Hạn chế thực sự là bạn không thể kết hợp C và ASM trong cùng một thói quen.Từ một nền Pascal trong đó trộn ASM nội tuyến là phổ biến trong mã khoa học, tôi hoàn toàn có thể đồng ý với quyết định thực thi việc tách ngôn ngữ thành các chức năng khác nhau. –

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