Вычислить размер в шестнадцатеричных байтах

как правильно рассчитать размер сегмента кода в шестнадцатеричных байтах. Мне дано:

IP = 0848    CS = 1488    DS = 1808   SS = 1C80    ES = 1F88

Практическое упражнение, над которым я работаю, спрашивает, каков размер (в шестнадцатеричных байтах) сегмента кода, и дает следующие варианты:

A. 3800    B. 1488    C. 0830    D. 0380    E. none of the above

Правильный ответ: A. 3800, но я понятия не имею, как это вычислить.


person raphnguyen    schedule 22.09.2011    source источник
comment
Что такое шестнадцатеричные байты? 1 байт = 2 шестнадцатеричных байта, потому что им нужно два символа для печати в шестнадцатеричном формате?   -  person Thilo    schedule 22.09.2011
comment
@ Тило, я не уверен. Должно быть, я пропустил этот раздел в классе, потому что я не вижу его в своих конспектах.   -  person raphnguyen    schedule 22.09.2011
comment
Разве сегмент кода не должен быть размером с сегмент данных? т.е. 0x1808-0x1488 = 0x0380.   -  person erikH    schedule 22.09.2011
comment
И если это домашнее задание, отметьте его как одно...   -  person erikH    schedule 22.09.2011
comment
@erikH Это не домашнее задание, так как ответ дан из учебного пособия.   -  person raphnguyen    schedule 22.09.2011


Ответы (1)


Как рассчитать длину:

  • Обратите внимание на КС. Найдите регистр отрезка, ближайший к нему, но больший.
  • Возьмите разницу между ними и умножьте на 0x10 (читай: прибавьте 0).

В вашем примере ближе всего ДС. 1808 - 1488 == 380. И 380 х 10 = 3800.

Кстати, это работает только на 8086 и других, таких же тупоголовых процессорах, и в реальном режиме на x86. В защищенном режиме на x86 (то есть, если вы не пишете загрузочный сектор или простую программу DOS), значение регистра сегмента имеет очень мало общего с размером сегмента, и, таким образом, все вышеперечисленное просто не применяется.

person cHao    schedule 22.09.2011
comment
Спасибо! Все практические упражнения выполняются с учетом архитектуры 8086. - person raphnguyen; 22.09.2011
comment
Я знаю, что этому вопросу несколько лет, но, честно говоря, я бы сказал, что размер сегмента кода составляет 65536 байт (или 64 КБ). Что бы вы сказали о размере сегмента кода, если CS=DS=ES=SS=2000h (что было бы то, что вы увидите в крошечной модели памяти). Ничто на 8086 не препятствует выполнению кода в сегменте данных (если они перекрываются) - person Michael Petch; 22.08.2015
comment
@MichaelPetch: Однако, если сегменты перекрываются лишь частично, вы, вероятно, используете более семантический макет памяти. Хотя вы можете выполнять байты данных на 8086, частичное перекрытие намекает на то, что вы на самом деле не хотите этого делать -- что вы намереваетесь, чтобы байты с этого момента были данными ( или стек), а не код. Было бы ошибкой рассматривать эти байты как часть сегмента кода, даже если технически они таковыми являются. - person cHao; 25.08.2015