Як я можу побачити код складання для програми C ++?


Відповіді:


167

Запитайте у компілятора

Якщо ви будуєте програму самостійно, ви можете попросити ваш компілятор видати джерело збірки. Для більшості компіляторів UNIX використовується -Sкомутатор.

  • Якщо ви використовуєте асемблер GNU, компіляція з -g -Wa,-alhдаватиме змішане джерело та збірку на stdout ( -Waпросить драйвер компілятора передати параметри асемблеру, -alвключить список складання та -ahдодає лістинг "джерела високого рівня"):

    g++ -g -c -Wa,-alh foo.cc

  • Для Visual Studio використовуйте /FAsc.

Зазирнути в двійкове

Якщо ви склали двійкові,

  • використання objdump -d a.outв UNIX (також працює для cygwin),
  • dumpbin /DISASM foo.exe на Windows.

Використовуйте свій налагоджувач

Налагоджувачі також можуть показувати безвідмовно.


35

У GCC / G ++ компілюйте з -S. Це виведе something.sфайл з кодом складання.

Редагувати: Якщо ви хочете, щоб результат був у синтаксисі Intel (який є IMO, його набагато читабельніше, і більшість навчальних посібників з його використання використовують), компілюйте з -masm=intel.


5
додати також -fverbose-asmваріант
osgx

23

У Visual Studio ;

  1. встановити точку перерви
  2. запускайте програму, поки вона не зупиниться на точці розриву
  3. клацніть правою кнопкою миші на вихідний код і виберіть "показати розбір"

14

Для gcc / g ++

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

Це призведе до створення prog.s з деякими коментарями до змінних, що використовуються у кожному рядку asm:

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


6

Багато людей вже розповіли, як випускати код складання за допомогою даного компілятора. Іншим рішенням є складання об’єктного файлу та скидання його за допомогою інструмента, такого як objdump , readelf (на Unix) або DUMPBIN ( посилання ) (у Windows). Ви також можете скинути виконувану програму, але прочитати вихід буде складніше.

Це має перевагу працювати однаково з будь-яким компілятором.


6

Який би ви не використовували налагоджувач, повинен мати перегляд збірки (Visual Studio, Borland IDE, gdb тощо). Якщо ви не використовуєте відладчик, і ви просто хочете побачити, яка збірка є в програмі, ви можете скористатися розбиральником або запустити програму і приєднати до неї відладчик і зробити дамп звідти. Див посилання на дизасемблери для отримання інформації про параметри.


5

Як хтось уже згадував, налагоджувач вашої платформи - хороша відправна точка. Перегляньте IDA Pro , щоб дізнатись про відбійний молот усіх налагоджувачів та розбирачів .

На платформах Unix / Linux (включаючи Cygwin) можна використовувати objdump --disassemble <executable>.


Якщо є можливість змусити компілятор генерувати асемблер (наприклад, gcc -S або варіант VS / FA нижче), то це краще, ніж розбирати. Це більш символічно.
Марко ван де Ворт

Звичайно, якщо у вас є джерело.
Орі Пессач

2
До речі, ви здивуєтеся, скільки інформації про символи може вивести IDA Pro.
Ori Pessach

5

Більшість компіляторів мають можливість вивести список складання. Наприклад, з VisualStudio ви можете використовувати щось на кшталт:

cl.exe /FAfile.asm file.c

Для кращої читабельності більшість налагоджувачів запропонують вигляд, який перемежовує розбирання з вихідним джерелом, тому ви можете порівнювати код з вихідним рядком компілятора за рядком.



3

Ви також можете спробувати цей сайт: http://assembly.ynh.io/

Там ви можете вставити код C або C ++ і натиснути синю кнопку, щоб побачити еквівалентну версію збірки.


FYI, не вдалося завантажити
kaiwan

Так, ще в 2015 році він працював чудово, потім раптом припинився. Потім з'явився ctoassembly.com, але він працював лише для невеликої підмножини C. Те саме: "не завантажувати більше". Дуже погано.
Gomes JA

2

У Visual Studio ви можете створити список асемблерів для проекту C ++.

Перейдіть до властивостей проекту, а потім до C ++ / Output Files та встановіть параметр Assembler Output та розташування списку ASM на ім’я файлу.


1

На Intel Mac OS X 10.8 (Mountain Lion) -masm=intelдиректива не працювала. Однак якщо у вас встановлений Xcode , він повинен був встановити інструмент під назвою 'otool':

otool code.o -tV

Ви повинні надати скомпільований код об'єкта як параметр.


0

Якщо ви користувач Eclipse, ви можете скористатися поданням Розбирання .

У вікні "Демонтаж" показана завантажена програма як інструкція асемблера, змішана з вихідним кодом для порівняння. Поточний рядок, що виконується, позначається маркером стрілки та виділяється у вікні. Ви можете виконати такі завдання у вікні Демонтаж:

  • Встановіть точки прориву на початку будь-якої інструкції асемблера
  • Увімкнення та вимкнення точок перерви та встановлення їх властивостей
  • Перегляньте інструкції з розбирання програми
  • Перейдіть до конкретних інструкцій програми

Ви можете трохи допрацювати?
Пітер Мортенсен

Існує також перегляд збірки при налагодженні в MSVC
phuclv

Зараз у мене немає робочого середовища розробки Eclipse C ++, але ось офіційна документація: help.eclipse.org/kepler/…
Пітер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.