Адрес места нахождения инструкции вызова

Я думаю, что инструкция вызова - это своего рода инструкция перехода. Инструкция "прыжок" имеет адрес, куда идти. И инструкция "call" либо должна иметь целевой адрес. Но когда я разбираю двоичный файл, у инструкции "call" есть только метка целевой функции. Тогда откуда они знают, куда идти? Другими словами, где я могу найти целевой адрес каждой функции? x86, ARM что угодно.

1 ответ

Решение

Адреса в программировании сборки обычно обозначаются символическими именами. И это верно не только для инструкции вызова, но и для всех других инструкций.

Есть причина для такого подхода - адреса всегда зависят от того, где в памяти загружена программа. Кроме того, некоторые инструкции содержат не сам адрес, а смещение относительно текущего адреса, где выполняется программа.

С другой стороны, программисту обычно не важно точное значение адреса. Он только хочет знать, где находится этот адрес. Вот почему используются символические метки.

Использование символических меток со значимыми именами улучшает удобочитаемость исходного кода и облегчает поддержку и расширение программы.

Эти символьные адреса (метки) преобразуются в числа при сборке исходного кода в исполняемый двоичный файл.

В зависимости от исполняемого формата, иногда перевод является частичным - вычисляются только смещения относительно начала кода. Это так называемые "перемещаемые" метки.

Позже, когда ОС загружает двоичный файл по какому-то конкретному адресу в памяти, все перемещаемые адреса фиксируются, чтобы получить правильные числовые значения для места загрузки двоичного файла.

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

Другие вопросы по тегам