Сборка: сегмент данных, когда вызывается из C или создается как независимая программа - PullRequest
1 голос
/ 24 апреля 2010

Я запутался в этом; Я не думаю, что должна быть какая-то разница в обоих случаях программа заканчивается как исполняемый файл. Пожалуйста, помогите, если вы думаете, отличается ...

Позвольте мне уточнить мой вопрос: Есть ли разница в определении или обработке сегмента данных
между тем, когда я создаю программу сборки «автономно» и когда я вызываю процедуру сборки из C программы?

Кто определяет местоположение или размер сегмента даты в обоих случаях? Это компилятор или операционная система? А как значение сегмента данных определяется в обоих случаях?

1 Ответ

0 голосов
/ 25 апреля 2010

Зависит от операционной системы!

Если мы ищем операционную систему Windows под IA32, то API резервирует адресное пространство виртуальной памяти некоторого приложения и:

  • CS сегмент, указать начало память программы или кода.
  • Сегмент DS, укажите начало переменная или память данных.
  • Сегмент SS, укажите начало стековая память и такая же, как у DS.
  • ES, поскольку дополнительный сегмент обычно находится в использовать для инструкций по переносу строк (lodsb, stosw, ...) и совпадает с DS.
  • FS как еще одна дополнительная точка сегмента в данных ядра ОС, таких как Информация о потоке Win32 Блок .
  • 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 }

Sheck также: сегментация памяти x86

...