Что означает "DS: [40207A]" означает в сборке?

0040103A   CALL DWORD PTR DS:[40207A]                USER32.MessageBoxA

Что означает DS:?

Ответы

Ответ 1

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

EDIT:

Небольшая разработка - обратите внимание на то, что, чтобы все было просто, это связано с 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 может использовать только несколько глобальных дескрипторов и использовать все процессы те.

ИЗМЕНИТЬ 2:

Формат Portable Executable определяет sections, которые не связаны с x86 segments - даже если есть некоторое концептуальное перекрытие. PE EXE могут иметь практически любой макет раздела, который вы хотите, но нормалью является разделение на (по крайней мере) код (чтение/выполнение), данные (чтение/запись), ресурсы (только для чтения?). Разделение исполняемого файла на разделы позволяет применять защиту памяти уровня страницы на уровне x86 в диапазонах памяти.

ИЗМЕНИТЬ 3:

В то время как нормальные сегменты не изменяются для каждого процесса, Windows использует регистр FS, чтобы указать на структуру TIB в потоке.

EDIT 4:

См. этот для обзора. Это из старого документа на 80386, но информация по-прежнему применяется.

Ответ 2

Адреса памяти состоят из сегмента и смещения; DS - это регистр "сегмент данных".