Làm cách nào để xem mã lắp ráp cho chương trình C ++?


Câu trả lời:


167

Hỏi trình biên dịch

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 -Schuyể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,-alhsẽ cung cấp nguồn và lắp ráp xen kẽ trên thiết bị xuất chuẩn ( -Wayê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, -albật danh sách lắp ráp và -ahthê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.

Nhìn vào nhị phân

Nếu bạn đã biên dịch nhị phân,

Sử dụng trình gỡ lỗi của bạn

Con nợ cũng có thể thể hiện một cách bừa bãi.


35

Trong GCC / G ++, biên dịch với -S. Điều đó sẽ xuất ra một something.stậ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.


5
thêm -fverbose-asmtùy chọn
osgx

23

Trong Visual Studio ;

  1. đặt điểm dừng
  2. chạy chương trình cho đến khi nó dừng ở điểm dừng
  3. nhấp chuột phải vào mã nguồn và chọn "hiển thị phân tách"

14

Dành cho gcc / g ++

gcc -save-temps -fverbose-asm prog.c

Điều này sẽ tạo prog.s với một số nhận xét về các biến được sử dụng trong mỗi dòng asm:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #


6

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.


6

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.


5

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>.


Nếu có một tùy chọn để trình biên dịch tạo trình biên dịch chương trình (như gcc -S hoặc tùy chọn VS / FA bên dưới), thì tốt hơn là nên tháo gỡ. Nó mang tính biểu tượng hơn.
Marco van de Voort

Chắc chắn, nếu bạn có nguồn.
Ori Pessach

2
Nhân tiện, bạn sẽ ngạc nhiên về số lượng thông tin biểu tượng có thể được suy ra bởi IDA Pro.
Ori Pessach

5

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.



3

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.


FYI, không tải được
kaiwan

Vâng, trở lại năm 2015 nó đã hoạt động tốt, sau đó nó đột nhiên dừng lại. Sau đó đến ctoassinstall.com, nhưng nó chỉ hoạt động với một tập hợp con nhỏ của C. Điều tương tự: không tải nữa. Quá tệ.
Gomes JA

2

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.


1

Trên Intel Mac OS X 10.8 (Mountain Lion), lệnh -masm=intelnày không hoạt động. Tuy nhiên, nếu bạn đã cài đặt Xcode , thì nó nên cài đặt công cụ có tên 'otool':

otool code.o -tV

Bạn phải cung cấp mã đối tượng được biên dịch dưới dạng tham số.


0

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

Bạn có thể xây dựng một chút?
Peter Mortensen

Ngoài ra còn có chế độ xem lắp ráp khi gỡ lỗi trong MSVC
phuclv

Tôi không có môi trường phát triển Eclipse C ++ hoạt động ngay bây giờ, nhưng đây là tài liệu chính thức: help.eclipse.org/kepler/ mẹo
Pieter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.