Вывод и ввод с точки зрения ассемблера
При использовании функции вывода переменные помещаются в стек, а потом применяются в качестве параметров. Понимание, как это выглядит на низком уровне, расширит ваши знания о работе программного обеспечения и, соответственно, позволит более эффективно заниматься его исследованием.
Стандартная функция вывода
Для вывода данных задействуем функцию
Теперь смотрим на машинный код. Вот, как выглядит вывод строкового литерала:
Как вы можете видеть, строковый литерал, в первую очередь, помещается в стек для вызова в качестве параметра
Тут можно отметить, что сначала переменная intvar пермещается в регистр EAX, который записывается в стек совместно со строковым литералом %i, применяемым для обозначения целочисленного вывода. Далее эти переменные берутся из стека и задействуются в качестве параметров при вызове
Пользовательский ввод
Теперь рассмотрим ввод пользователя посредством потока сin из C++. Но сначала глянем на наш код:
В данной функции мы лишь записываем строку в переменную sentence посредством функции C++ cin, а потом выводим предложение, используя оператор
Как это выглядит в машинном коде? Смотрим функцию cin:
Обратите внимание, что сначала инициализируется строковая переменная sentence, потом осуществляется вызов cin с последующей записью введенных данных в sentence.
Итак, программа устанавливает содержимое переменной sentence в EAX, потом помещает EAX в стек, откуда значение нашей переменной станет применяться в качестве параметра для потока cin. Далее происходит вызов оператора потока >>. Его вывод помещается в ECX, который потом перемещается в стек для оператора
Итак, мы вкратце рассмотрели стандартный вывод функции и пользовательский ввод на низком уровне. Соответствующие знания являются базовыми и могут пригодиться тем, кто только начинает осваивать профессию реверс-инженера.
По материалам «BOLO: Reverse Engineering — Part 1 (Basic Programming Concepts)».