Сборка: сегмент данных, когда вызывается из 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

Другие вопросы по тегам