Генерация адреса инструкции с использованием сегмента кода и указателя инструкций - PullRequest
1 голос
/ 13 января 2020

Рассмотрим адрес сегмента кода как FE00, а указатель инструкции - ABBE. Сдвиг сегмента кода на 4 бита и добавление указателя инструкции приводит к дополнительному переносу. Как мы представляем сгенерированный адрес?

1 Ответ

2 голосов
/ 19 января 2020

Рассмотрим адрес сегмента кода как 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.

...