Сборка: сегмент данных, когда вызывается из C или создается как независимая программа
Я запутался в этом; Я не думаю, что должна быть какая-то разница в обоих случаях, программа заканчивается как исполняемый файл. Пожалуйста, помогите, если вы думаете, отличается....
Позвольте мне уточнить мой вопрос: есть ли разница в определении или обработке сегмента данных
между тем, когда я создаю программу сборки "автономно" и когда я вызываю процедуру сборки из программы на C?
Кто определяет местоположение или размер сегмента даты в обоих случаях? Это компилятор или операционная система? И как значение сегмента данных определяется в обоих случаях?
1 ответ
Зависит от операционной системы!
Если мы ищем операционную систему Windows под IA32, то API резервирует адресное пространство виртуальной памяти некоторого приложения и:
- Сегмент CS, указывает на начало программы или памяти кода.
- Сегмент DS, указывает на начало переменной или памяти данных.
- Сегмент SS, указывает на начало стековой памяти и совпадает с DS.
- ES как дополнительный сегмент обычно используется для команд переноса строк (lodsb, stosw, ...) и является таким же, как DS.
- FS как еще одна дополнительная точка сегмента данных ядра ОС, таких как http://en.wikipedia.org/wiki/Win32_Thread_Information_Block.
- GS как еще один дополнительный сегмент равен 0 как начало выделенного адресного пространства виртуальной памяти загруженного приложения.
Пример доступа к "Информационному блоку потока Win32" через сегмент FS:
function GetThreadId: integer;
//result := GetCurrentThreadId;
asm
mov eax, fs:[$18] //eax := thread information block
mov eax, [eax + $24] //eax := thread id
end; { GetThreadId }
Шек также: сегментация памяти x86