2011-10-11 64 views
8

Tôi muốn hỏi về cái gì tôi đang suy nghĩ để thử với Visual Studio 2010.MS Visual Studio 2010 làm thế nào để sử dụng Asm tạo tập tin

tôi đang tạo ra một file .asm từ file the.cpp bằng cách thiết lập tùy chọn cho "Đầu ra Assembler" trong các thuộc tính của dự án -> C/C++ -> Tệp Xuất (/ FA).

Câu hỏi của tôi là, làm cách nào để bước tiếp theo sử dụng tệp .asm được tạo để liên kết lại từ tệp đó mà không cần dùng tệp .cpp nữa, trong trường hợp tôi muốn thực hiện một số sửa đổi bên trong tệp .asm liên kết một lần nữa bằng cách giữ các sửa đổi tôi đã làm ở cấp độ lắp ráp.

Sẽ rất hữu ích nếu bạn có thể cung cấp các bước chính xác, bao gồm cấu hình chính xác có thể cần trong thuộc tính dự án.

+0

Trước tiên, bạn cần biên dịch nó bằng ML, sau đó bạn có thể chuyển đến trình liên kết. Nhìn vào các tham số dòng lệnh của ML.EXE, tôi chưa bao giờ thử nó trong VS2010. –

+0

Bạn có thể sử dụng mã asm nội tuyến trong một số trường hợp – BlackBear

+0

Hãy cẩn thận nếu bạn muốn sử dụng điều này cho bất kỳ điều gì ngoài thử nghiệm/học tập. Đầu ra lắp ráp MSVC không hoạt động tốt với C++ (xử lý ngoại lệ đặc biệt), và MS không hỗ trợ danh sách lắp ráp khác ngoài mục đích "thông tin". Xem http://stackoverflow.com/questions/7488056/a-problem-with-cl-exe-and-ml-exe/7495413#7495413 –

Trả lời

1
+0

Cảm ơn bạn đã dành thời gian, nhưng tôi đã biết hướng dẫn mô tả một trường hợp khác, khác với trường hợp của tôi. Như đã nói, tôi không muốn chỉ liên kết một hàm được viết bằng asm. Tôi có thể làm điều này một cách dễ dàng với nội tuyến asm bên trong tập tin .cpp. –

+0

Bạn không cần tệp cpp sau đó. Tôi đang biên dịch bằng cách sử dụng ml.exe với một bước xây dựng tùy chỉnh. – MartyTPS

+0

Như tôi đã nói, tôi đã thực sự tìm kiếm một giải pháp để sử dụng toàn bộ tệp .asm được tạo sau khi biên dịch nguồn C++ (tệp cpp), và sau đó chỉ sử dụng asm được tạo để biên dịch lại mà không cần sử dụng cpp nữa. Cảm ơn bạn. Đó là hướng dẫn cụ thể, mô tả một trường hợp trong đó ông sử dụng một chức năng ông đã viết trong asm cùng với các tập tin cpp, đó là khác với những gì tôi muốn. Tuy nhiên, tôi có thể sử dụng hướng dẫn đó để tìm giải pháp tùy chỉnh cho trường hợp của tôi vì tôi đã viết rất nhiều mã của tôi trong .asm bên trong tệp cpp. –

0

Tôi đã thực hiện việc này gần đây. Đây là câu trả lời của câu trả lời tôi đã nêu ở đây compile-assembly-output-generated-by-vc. Nó chỉ ra bạn vẫn có thể làm điều này trong chế độ 32-bit trong MSVC2012 nhưng tôi nghĩ rằng chế độ 64-bit là vô vọng.

Đối với chế độ 32 bit, đây là những gì bạn làm.

Tạo một dự án trống và một tập tin nguồn Source.cpp

#include <stdio.h> 
int main() { 
    printf("hello world\n"); 
    return 0; 
} 
  1. phải liếm vào dự án của bạn và chọn "Build Customization" và
    chọn MASM như mô tả ở đây http://www.masm32.com/board/index.php?topic=9231.0
  2. Dưới C++/OutputFiles chọn Assembly Output/FA
  3. Comipile ở chế độ 32 bit Chế độ phát hành
  4. Tải tập tin Source.asm vào MSVC để bạn có thể xem nó. Nó sẽ không hoạt động. Một vài thay đổi vẫn cần thiết.
  5. Dưới C++/Tối ưu hóa, tắt Tối ưu hóa toàn bộ chương trình (loại bỏ /GL). Điều này thêm dòng INCLUDELIB MSVCRT
  6. Trong Linker/nâng cao thiết lập các tùy chọn cuối cùng "Hình ảnh Có Handlers ngoại lệ an toàn" để Không (/SAFESEH:NO)
  7. Bây giờ bạn nên có một tập tin Source.asm mà sẽ làm điều tương tự mà Source. tệp cpp đã làm. Sao chép Source.cpp từ thư mục Release vào cùng thư mục với Source.cpp (vì vậy nó không bị xóa khi bạn xây dựng/dọn dẹp).
  8. Thêm Nguồn.asm (dưới dạng tệp hiện có) vào Tệp nguồn và xóa Source.cpp khỏi bản dựng.
  9. Xây dựng lại và bạn sẽ thấy "Hello World" mà không phải thay đổi bất kỳ dây chuyền lắp ráp nào bằng tay.

Tôi đã sử dụng tính năng này cho các chức năng phức tạp hơn. Tôi thường làm điều đó trên một mô-đun riêng biệt và sử dụng extern "C" trên tên hàm để loại bỏ tên mangling C++.

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