Вычисление диапазона адресов сегмента программы сборки 8086 - PullRequest
0 голосов
/ 28 января 2019

У меня есть следующие строки программы (написано для микропроцессора 8086):

first SEGMENT BYTE
  a db 7 dup (?)
first ENDS      

second SEGMENT WORD
  b dw 200 dup (?)
second ENDS

third SEGMENT PARA
  c db 3 dup (?)
  d dw ?
third ENDS

И мне нужно найти диапазон адресов этих трех сегментов, зная, что первый доступный адрес равен 1000h.

Для первого, поскольку в сегменте определены 7 x байтов, диапазон будет просто: 1000h: 1006h

Для второго - 200 x 2 = 400 = 190h байтов (так как1 слово = 2 байта)

Я знаю, что теперь мне нужно добавить это к начальному адресу, но я не знаю, что именно это будет.

Я предполагаю, что это все равно будет 1007, поэтому после этого диапазон второго сегмента будет просто: 1007h: (1007 + 190) h.Это правильно?Также то же самое рассуждение пойдет на третий сегмент?

1 Ответ

0 голосов
/ 29 января 2019

В синтаксисе MASM директива SEGMENT, за которой следует BYTE / WORD / PARA, указывает на выравнивание.Выравнивание говорит ассемблеру, что перед отправкой сегмента адрес должен быть округлен до ближайшей границы BYTE / WORD / PARA.Очевидно, что выравнивание BYTE не приведет к корректировке, поскольку каждый адрес памяти находится на границе байта.СЛОВО составляет 2 байта, а PARA - 16 байтов (размер PARAgraph)

Сегменты (по умолчанию) выводятся в том порядке, в котором они встречаются (это поведение может быть переопределено, но представленный код не делаеттакая модификация).

Счетчик стартовой программы, который нам дают, составляет 1000 часов.Учитывая первый раздел:

first SEGMENT BYTE
  a db 7 dup (?)
first ENDS 

Выравнивание BYTE ничего не меняет, поэтому начальный адрес по-прежнему 1000h.Мы излучаем 7 байтов с db 7 dup (?) от 1000 до 1006 часов (включительно).Счетчик программы после выдачи этого раздела равен 1007 ч (сразу после последнего выпущенного байта).Затем мы сталкиваемся со следующим разделом:

second SEGMENT WORD
  b dw 200 dup (?)
second ENDS

Выравнивание WORD означает, что мы должны округлить до адреса, который делится равномерно на 2, прежде чем выдать раздел.1007h, округленное до следующей границы WORD, равно 1008h.1008h делится поровну на 2. Мы испускаем 200 16-битных слов с dw 200 dup (?) на 400 байт.400 десятичных это 190 часов.Этот раздел будет охватывать диапазон от 1008 до 1197 часов включительно.Счетчик программы будет в 1198 ч.

third SEGMENT PARA
  c db 3 dup (?)
  d dw ?
third ENDS

PARA означает, что счетчик программы должен быть равномерно делим на 16 (десятичное число) до выдачи раздела.1198h уже не делится на 16 (десятичное число), поэтому оно требует корректировки.Следующий адрес, который делится на 16, это 11A0h (любое число, заканчивающееся шестнадцатеричной цифрой 0, делится на 16).Наш счетчик программ теперь 11A0h.3 байта передаются с db 3 dup (?) и одно слово с dw ? в общей сложности 5 байтов.Эти данные охватывают диапазон адресов 11A0h и 11A4h (включительно).Счетчик программы будет иметь значение 11A5h после отправки этого раздела.

Диапазон адресов ВСЕХ объединенных разделов будет от 1000h до 11A4h (включительно).

...