2015-07-31 4 views
0

Мне присвоены значения регистров для CS, DS, SS, ES, SP, BP, SI, DI, AX, BX, CX, DX. Как я могу найти размер в шестнадцатеричных байтах сегмента кода?Размер сегмента кода 8086

+1

Возможный дубликат [Рассчитать размер в Hex Bytes] (http://stackoverflow.com/questions/7509836/calculate-size-in-hex-bytes) –

+0

Я случайно не согласен с ответом в дублированном вопросе. Я почти согласен с ответом Сержа здесь, кроме как сказать, что весь сегмент - 64kb. Даже если сегмент равен 0xFFFF, он все еще 64kb и обтекает его в нижней части памяти. –

ответ

2

Вы не можете.

8086 довольно устарел сейчас, но некоторые динамозавры помнят об этом. Это был 16-разрядный процессор, но с 20 битами для адресов: 4 сегментные регистры (CS, DS, ES и SS) имели значения, сдвинутые на 4, и смещение было добавлено к этому. Общая адресуемая память составляла 1 Мбайт.

Максимальный размер любого сегмента составил 65536 байт (0x10000). Но фактический размер сегмента кода не был известен процессору. Не было никакой защиты памяти, и было разрешено записывать данные в середине сегмента кода (что может быть правильным или неправильным, если программист знал, почему :-()

Были разные модели памяти (например, Ссылка: 8086 Memory Model):

  1. Мельчайшие: CS = DS = SS = ES: общая программа, используемая 1 один сегмент и был ограничен 64k байт
  2. Малый:. один сегмент кода и один сегмент данных данные и код оба используются для адресации (16 бит).
  3. Компактный: один сегмент для кода, без ограничений для данных: код, используемый вблизи addre ssing (16 бит), и данные, используемые до адресации (32 бита: сегмент + смещение)
  4. Носитель: один один сегмент данных, без ограничений для кода
  5. Большой: нет ограничений для кода и данных

Итак:

  • максимальный код сегмента составляет 64 Кбайт, но используемый размер может быть меньше
  • код может использовать столько сегмент по мере необходимости (для средних и крупных модели) размер каждой был менее 64k
+0

Я согласен с вами по большей части, но я бы сказал, что размер ЛЮБОГО сегмента всегда 64kb (размер сегмента на 8086 не может быть изменен AFAIK), вы говорите: максимальный размер любого сегмента составлял 65536 байт (0x10000) _, я предполагаю, что размер сегмента всегда равен 64kb, и, как вы указываете, вы не можете вычислить, сколько из них даже используется на 8086. Этот вопрос появляется как дубликат другого, где он предположил, что сегмент кода можно вычислить, и я совершенно не согласен. –

+1

@MichaelPetch: то, что вы называете сегментом, - это память, адресуемая из одного базового регистра, и это действительно 64k на 8086! То, что я (и вопрос ref'd - хороший выбор для вас) вызывает сегмент, - это то, что объявленный линкером сегмент, и этот * ограничен * до 64k. Теперь * предполагая, что программа использует небольшую модель памяти * и *, предполагая CS

+0

Я понимаю, откуда вы родом, однако из того, как формулируются вопросы здесь, а другой нет упоминания о контексте (компоновщик) и т. Д. С отсутствием надлежащего контекста я возвращаюсь к тому, как процессор увидит его.У маленькой модели памяти все сегменты будут одинаковыми, но я сомневаюсь, что кто-то будет утверждать, что сегмент кода равен 0 байтам ;-). Я думаю, что вопросы не имеют ясности, и, возможно, вопросы здесь не так, как они были фактически предоставлены оригинальным плакатам. –

Смежные вопросы