От вас потребуется указать основание или смещение, а также линейный адрес, поскольку несколько пар Segment:Offset
могут отображаться на один и тот же линейный адрес.
, поэтому, если у нас естьсегмент 0xF400
и линейный адрес 0xF4170
, мы получаем смещение, равное 0xF4170 - (0xF400 << 4)
, равное 0x170
.
Выполнение этого только с учетом того, что линейный адрес не имеет единственного решения, поэтому вы должны выбрать соглашение для разделения 20-битного адреса на 16-байтовую выровненную часть seg
и байтовое смещение.Вот одна из возможных функций:
Segement = linear >> 4
(16 старших бит) offset = linear & 0x0F
(4 младших бит)
Вы можете выбратьканоническая форма с 12: 8 битами, оставляющая место для будущего расширения с более широкими линейными адресами.