Я понимаю, что мы можем выгрузить эквивалентную сборку из кода C++, используя много отладчиков и тому подобное.

Но как насчет двоичного кода? Форматирование битов в каждом байте (ях), которые составляют фактические машинные инструкции, которые (могут) составлять микропрограммы (если микроархитектура имеет один).

Если каждая строка кода C++ ДОЛЖНА быть каким-то образом преобразована в машинный код и в какой-то момент в программе (например, плавающий элемент может быть определен в C++, но он бесполезен, пока не помещен в стек, поэтому он может не преобразовывать 1:1 для всего машинного кода, построчно, но будет использоваться независимо), каждый оператор и т.д. Можно отследить. Но отладчики не выводят формирование битов, занимающих каждую отдельную инструкцию (и).

Если каждая программа становится отформатированной инструкцией для байтов / битовых комбинаций для CPU, должна быть возможность (я полагаю) отследить весь код, который вы пишете, до фактических битов на уровне схемы.

Но для полной гарантии, возможно ли сделать это в той степени, в которой я здесь описываю? Современные отладчики / программное обеспечение не предлагают эту функцию, и даже те, которые, по-видимому, не дают ясного для разработчика полного двоичного представления каждой инструкции.

PS: Это, конечно, предполагается, что скомпилированный код легко выполняется с инструкциями для предполагаемой архитектуры (а не с каким-то интерпретируемым языком или байт-кодом, который нуждается в другой программе для дальнейшего перевода для него).

2 ответа2

1

Вы можете использовать дизассемблер для преобразования скомпилированного двоичного кода обратно в язык ассемблера. Это позволит вам "читать" (с трудом) программное обеспечение, распространяемое только в двоичном виде.

Что касается другой части вашего вопроса, вам, кажется, нужен какой-то аппаратный декомпилятор, который дает более подробную информацию о том, как процессор выполняет конкретную двоичную инструкцию. Я не знаю ни одного инструмента для этого. Вам, вероятно, придется прочитать руководства по аппаратному обеспечению и провести такой анализ в своей голове.

1

Нет.

Ну, может быть, но нет гарантии, потому что код, который входит в компилятор, редко совпадает с кодом, который выходит по двум причинам: люди ужасно пишут эффективный код, и люди не думают о коде одинаково что процессор должен обрабатывать его в. Из-за этого компиляторы будут оптимизировать исходный код перед преобразованием его в сборку / двоичный файл. Это может привести к переупорядочению операторов, удалению бесполезных операторов и добавлению целых функций.

Например, дан следующий псевдокод:

int x = 3;
x = 3*3;
x = 4;
function mult4(number) { return number * 4; }
x = mult4(x);

может быть полностью уменьшен до

int x = 16;

хорошим оптимизирующим компилятором, который совсем не соответствует исходному тексту. Вот почему при отладке вам часто приходится отключать оптимизацию компилятора. Если все оптимизации компилятора отключены, компилятор попытается вывести сборку, соответствующую исходному коду 1-в-1.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .