Определение данных внутри раздела кода в сборке x86

#assembly #x86 #sections #opcode #fasm

# #сборка #x86 #разделы #код операции #fasm

Вопрос:

Ниже приведен небольшой фрагмент кода из программы, над которой я работаю.

 format PE console
entry start

include 'win32a.inc'

section '.text' code readable executable
start:
    jmp     skip_data ; no need to execute data
    my_data     db      1,2,3,4,5
    my_data_end:

skip_data:
    mov     ecx,my_data_end - my_data
    mov     esi,my_data
 

Я работаю над fasm. Здесь я намеренно определяю данные внутри моего раздела кода, чтобы что-то проверить. Я собрал его и увидел исполняемый файл с помощью шестнадцатеричного редактора. Мой раздел кода начинается со смещения 200 . Данные my_data были сохранены из смещения 202 , которое, как ожидается, jmp skip_data занимает 2 байта в своей кодировке, но позже, когда я увидел код операции для mov esi,my_data , это было BE 02 10 40 00 . Теперь BE соответствует mov esi, , но я не могу понять следующие 4 байта здесь. Я ожидал, что вместо my_data , я буду иметь 202 , поскольку это начальный адрес смещения моих данных в разделе кода, но здесь у меня есть что-то еще. Я не уверен, что здесь означают эти 4 закодированных байта.

Мое второе сомнение касается хранения данных в разделе кода. Какое влияние это окажет, если я сохраню свои данные в разделе кода вместо раздела данных. Конечно, данные в этом случае не будут доступны для записи, но будут ли у них какие-либо другие отличия, кроме этого? Что вообще означают флаги раздела кода и данных?

Комментарии:

1. Ваш .text раздел не начинается с абсолютного нулевого адреса. Похоже, это связано с 0x401000 . Если вы использовали шестнадцатеричный редактор, который, вероятно, дал вам смещение файла, а не адрес виртуальной памяти, который будет использовать процессор.

2. Не уверен, как вы это определили. Как я уже сказал, я предполагаю, что вы использовали шестнадцатеричный редактор, который просто дает вам смещение файла, которое не имеет значения. Именно так и устроен PE-файл.

3. Хорошо, теперь я еще больше запутался. Из того, что я знаю, смещения файлов позже преобразуются в физические адреса во время загрузки exe-файла. На каком этапе происходит виртуальная адресация? Действительно ли смещения файлов ike сначала преобразуются в VAS, а затем VAS в физический адрес?

4. Файл содержит код, уже связанный для определенного виртуального адреса. Обычно он загружается туда, и больше никакого преобразования (перемещения) не требуется, но если информация есть, загрузчик может исправить адреса.

5. можете ли вы предоставить какой-нибудь источник, где я могу правильно прочитать об этом?