2012-02-23 3 views
0

Я недавно начал работу с ассемблером x86, но не могу найти какой-либо метод, чтобы узнать, существует ли какая-либо функция в коде, и если она была вызвана при выполнении или не.Как узнать, существует ли определенная функция и был вызван

Например, у меня есть код с функцией «Сумма», мне нужна команда или что-нибудь, что позволяет мне знать, существует ли в коде ассемблера «Сумма» и вызывается в процессе выполнения.

Заранее спасибо Лютор

ответ

2

Там нет никакого способа узнать, если функция была вызвана уже или нет с созданием этой функции установить некоторую глобальную память где-то указать его первое использование (аль-ли static в C). с точки зрения знания, существует ли это, это также почти невозможно, если функция не имеет записи EAT, и в этом случае вы можете использовать GetProcAddress для получения адреса и проверить, что он не является нулевым.

Если вы хотите сделать это при компиляции, вы можете узнать, существует ли функция, пытаясь вызвать ее, и пусть ассемблер или компоновщик подбрасывают вам ошибку, если это не так.

С учетом сказанного, похоже, что вы должны пересмотреть свой подход, почему именно вам нужно сказать, была ли уже вызвана функция, а если она существует или нет?

+0

Лютор здесь, спасибо за ваш ответ. Вопрос в одном из моих упражнений. В нем говорится: «Объясните практический способ узнать, существует ли в ассемблере функция, называемая« Hello ». Объясните, как узнать, существует ли она, эта функция вызывается или нет». Еще раз спасибо – LuthorMithos

0

Ну, если вы просто хотите увидеть, существует ли функция в коде, вы можете найти ее в своем редакторе. Если вы его найдете, он существует.

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

0

Чтобы узнать, существует ли подпрограмма «Hello», есть несколько вещей, которые можно попробовать.

Из командной строки * NIX ...

В верхней части дерева проекта, выполнить "Grep -lrw Hello *". Это вернет список файлов, содержащих слово «Hello». Затем вам просто нужно искать эти файлы.

Альтернативно, если у вас есть отладочная информация, скомпилированная в ваши библиотеки/объектные файлы, вы можете попробовать «nm | grep Hello», чтобы определить, существует ли подпрограмма «Hello».

Или вы можете выполнить «objdump -d» и выполнить поиск подпрограммы/метки с именем «Hello» (также предполагается, что информация об отладке включена в изображение).

Однако многие IDE имеют встроенные функции поиска. Вы можете использовать это, если используете его.

Что касается определения того, была ли эта подпрограмма вызвана, это потребует установки и проверки глобальной переменной во время выполнения.

Надеюсь, что это поможет.

0

Наконец-то я нашел способ. Компилятор Gcc имеет параметр -S, который заставляет его создавать код ассемблера, а затем с помощью grep вы можете его увидеть. Чтобы узнать, выполнено ли это, точка останова работала до сих пор.

Спасибо, ребята!