Рассмотрим адрес сегмента кода как FE00, а указатель инструкции - ABBE. Как мы представляем сгенерированный адрес?
Либо вы представляете адрес как
0FE00h:0ABBEh
, его сегментированная форма с использованием двух 16-битных чисел, разделенных двоеточием и всегда (сегмент - двоеточие - смещение) 00108BBEh
, его линейная форма с использованием одного 32-разрядного числа
Независимо от вашего выбора, для 8086 всегда требуются регистры размером 2 слова .
"Указатель команды - это смещение в сегменте памяти 64 КБ, начинающееся с линейного адреса, полученного умножением значения в регистре кода CS
. на 16 (аналогично сдвигу влево 4 раза). "
Вычисление линейного адреса может быть выполнено неэффективно (но легко для понимания), например:
mov ax, 0FE00h ; The code segment
mov dx, 16
mul dx ; "shifting the code segment by 4 bits"
add ax, 0ABBEh ; "adding the instruction pointer"
adc dx, 0 ; Taking care of the additional carry
Этот линейный адрес 00108BBEh использует 2 регистры AX
и DX
. Регистр AX
будет содержать наименее значимую часть 8BBEh, а регистр DX
будет содержать наиболее значимую часть 0010h. Если вам нужно обратиться ко всей паре регистров, вы делаете это как DX:AX
. Итак, highWord - двоеточие - lowWord.
В отличие от нотации seg: off, это всего лишь одно 32-разрядное число, разделенное на 2 регистра, без перекрывающихся значений места. Младший бит старшей половины имеет значение места 2 ^ 16, когда мы говорим о плоском 32-битном (или 20-битном) числе, а не об адресе seg: off.