0040103A CALL DWORD PTR DS:[40207A] USER32.MessageBoxA
Что означает DS:
?
0040103A CALL DWORD PTR DS:[40207A] USER32.MessageBoxA
Что означает DS:
?
Это означает, что инструкция ссылается на память в сегменте данных - и ее можно в значительной степени игнорировать на современных ОС, поскольку они работают с моделью с плоским адресным пространством (сегменты кода, данных и стека все относятся к одному и тому же диапазону памяти и защита памяти обрабатывается с помощью поискового вызова).
Небольшая разработка - обратите внимание на то, что, чтобы все было просто, это связано с 32-битным защищенным режимом, работающим под Windows.
Регистр сегментов (CS, DS, SS, ES, FS, GS) содержит a selector
, указывающий на descriptor
. Существуют две таблицы дескрипторов: global (GDT) и локальные (LDT), а селектор имеет бит, указывающий, что использовать. Windows (почти?) Использует исключительно глобальную таблицу.
Дескриптор в основном пара {начало-адрес, размер} - там больше, но это выходит за рамки этого сообщения.
В Windows используется Flat Memory Model: каждый процесс имеет адресное пространство 4 ГБ, начиная с адреса памяти 0, и использует paging, чтобы изолировать процессы от eachother.
Поскольку процессы имеют этот плоский вид мира, они работают со всеми сегментами с использованием дескрипторов {0, 4 ГБ} - и, следовательно, вместо выделения дескрипторов каждого процесса Windows может использовать только несколько глобальных дескрипторов и использовать все процессы те.
Формат Portable Executable определяет sections
, которые не связаны с x86 segments
- даже если есть некоторое концептуальное перекрытие. PE EXE могут иметь практически любой макет раздела, который вы хотите, но нормалью является разделение на (по крайней мере) код (чтение/выполнение), данные (чтение/запись), ресурсы (только для чтения?). Разделение исполняемого файла на разделы позволяет применять защиту памяти уровня страницы на уровне x86 в диапазонах памяти.
В то время как нормальные сегменты не изменяются для каждого процесса, Windows использует регистр FS
, чтобы указать на структуру TIB в потоке.
См. этот для обзора. Это из старого документа на 80386, но информация по-прежнему применяется.
Адреса памяти состоят из сегмента и смещения; DS - это регистр "сегмент данных".