Рассчитать сегмент: смещение от абсолютного адреса - PullRequest
2 голосов
/ 27 февраля 2012

Я могу рассчитать адрес Segment:Offset как Segment * 0x10 + Offset. Но как мне рассчитать обратное?

например. как мне получить от 0xF4170 до F400:0170 и от 0xACF04 до ABCD:1234?

1 Ответ

3 голосов
/ 27 февраля 2012

От вас потребуется указать основание или смещение, а также линейный адрес, поскольку несколько пар Segment:Offset могут отображаться на один и тот же линейный адрес.

, поэтому, если у нас естьсегмент 0xF400 и линейный адрес 0xF4170, мы получаем смещение, равное 0xF4170 - (0xF400 << 4), равное 0x170.


Выполнение этого только с учетом того, что линейный адрес не имеет единственного решения, поэтому вы должны выбрать соглашение для разделения 20-битного адреса на 16-байтовую выровненную часть seg и байтовое смещение.Вот одна из возможных функций:

  • Segement = linear >> 4 (16 старших бит)
  • offset = linear & 0x0F (4 младших бит)

Вы можете выбратьканоническая форма с 12: 8 битами, оставляющая место для будущего расширения с более широкими линейными адресами.

...