#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. можете ли вы предоставить какой-нибудь источник, где я могу правильно прочитать об этом?