Làm cách nào để xem mã lắp ráp cho chương trình C ++?
Các công cụ phổ biến để làm điều này là gì?
Làm cách nào để xem mã lắp ráp cho chương trình C ++?
Các công cụ phổ biến để làm điều này là gì?
Câu trả lời:
Nếu bạn đang tự xây dựng chương trình, bạn có thể yêu cầu trình biên dịch của mình phát ra nguồn lắp ráp. Đối với hầu hết các trình biên dịch UNIX sử dụng -S
chuyển đổi.
Nếu bạn đang sử dụng trình biên dịch GNU, việc biên dịch với -g -Wa,-alh
sẽ cung cấp nguồn và lắp ráp xen kẽ trên thiết bị xuất chuẩn ( -Wa
yêu cầu trình điều khiển trình biên dịch chuyển các tùy chọn cho trình biên dịch, -al
bật danh sách lắp ráp và -ah
thêm danh sách "nguồn cấp cao"):
g++ -g -c -Wa,-alh foo.cc
Đối với Visual Studio, sử dụng /FAsc
.
Nếu bạn đã biên dịch nhị phân,
objdump -d a.out
trên UNIX (cũng hoạt động cho cygwin),dumpbin /DISASM foo.exe
trên Windows.Con nợ cũng có thể thể hiện một cách bừa bãi.
disas
lệnh trong GDB,Trong GCC / G ++, biên dịch với -S
. Điều đó sẽ xuất ra một something.s
tập tin với mã lắp ráp.
Chỉnh sửa: Nếu bạn muốn đầu ra theo cú pháp Intel (là IMO, dễ đọc hơn nhiều và hầu hết các hướng dẫn lắp ráp đều sử dụng nó), hãy biên dịch với -masm=intel
.
-fverbose-asm
tùy chọn
Trong Visual Studio ;
Trang web này hiện đang làm việc cho tôi (2017): https://godbolt.org/
Nhiều người đã nói làm thế nào để phát ra mã lắp ráp với một trình biên dịch nhất định. Một giải pháp khác là biên dịch một tệp đối tượng và kết xuất nó với một công cụ như objdump , readelf (trên Unix) hoặc DUMPBIN ( liên kết ) (trên Windows). Bạn cũng có thể kết xuất một tệp thực thi, nhưng sẽ khó đọc đầu ra hơn.
Điều này có lợi thế là làm việc theo cùng một cách với bất kỳ trình biên dịch.
Bất kỳ trình gỡ lỗi nào bạn đang sử dụng đều phải có chế độ xem lắp ráp (Visual Studio, Borland IDE, gdb, v.v.). Nếu bạn không sử dụng trình gỡ lỗi và bạn chỉ muốn xem phần nào trong chương trình, bạn có thể sử dụng trình phân tách hoặc thay thế, chạy chương trình và đính kèm với trình gỡ lỗi và thực hiện kết xuất từ đó. Xem tài liệu tham khảo cho người tháo gỡ để biết thông tin về các tùy chọn.
Như một người khác đã đề cập, trình gỡ lỗi nền tảng của bạn là điểm khởi đầu tốt. Đối với jackhammer của tất cả các trình gỡ lỗi và trình dịch ngược, hãy xem IDA Pro.
Trên các nền tảng Unix / Linux (bao gồm cả Cygwin), bạn có thể sử dụng objdump --disassemble <executable>
.
Hầu hết các trình biên dịch có một tùy chọn để đưa ra một danh sách lắp ráp. Ví dụ: với VisualStudio, bạn có thể sử dụng một cái gì đó như:
cl.exe /FAfile.asm file.c
Tuy nhiên, để dễ đọc nhất, hầu hết các trình gỡ lỗi sẽ cung cấp một khung nhìn xen kẽ việc tháo gỡ với nguồn ban đầu, do đó bạn có thể so sánh mã của mình với dòng đầu ra của trình biên dịch theo từng dòng.
PE Explorer Disassembler cho các tệp PE 32 bit. IDA cho người khác.
Bạn cũng có thể thử trang web này: http://assinstall.ynh.io/
Ở đó, bạn có thể dán mã C hoặc C ++ của mình và nhấn nút màu xanh để xem phiên bản lắp ráp tương đương.
Trong Visual Studio, bạn có thể tạo danh sách trình biên dịch chương trình cho dự án C ++.
Chuyển đến thuộc tính dự án, sau đó đến C ++ / Tệp đầu ra và đặt cài đặt Đầu ra của Trình biên dịch và vị trí danh sách ASM thành tên tệp.
Nếu bạn là người dùng Eclipse, bạn có thể sử dụng khung nhìn Tháo gỡ .
Khung nhìn Tháo gỡ hiển thị chương trình được tải dưới dạng hướng dẫn trình biên dịch trộn với mã nguồn để so sánh. Dòng hiện đang được chỉ định bởi một dấu mũi tên và được tô sáng trong chế độ xem. Bạn có thể thực hiện các tác vụ sau trong giao diện Tháo gỡ:
- Đặt điểm dừng khi bắt đầu bất kỳ lệnh biên dịch chương trình biên dịch chương trình
- Kích hoạt và vô hiệu hóa các điểm dừng và thiết lập các thuộc tính của chúng
- Bước qua các hướng dẫn tháo gỡ chương trình của bạn
- Chuyển đến hướng dẫn cụ thể trong chương trình
Alt +8