IAPX88 может работать с 1 мегабайтом памяти (20-битная адресация), теперь мой вопрос заключается в том, как мы можем сделать 20-битный адрес, используя два 16-битных регистра. Пожалуйста, приведите пример.
Как сделать 20-битный адрес, используя два 16-битных регистра?
Ответы (2)
Физические адреса IAPX88 вычисляются путем взятия сегментного регистра, его сдвига влево на 4 бита и добавления регистра смещения.
Например, физический адрес в памяти, который выполняет код, равен (CS<<4)+IP
, где CS — это сегмент кода, а IP — указатель инструкции.
Подробную информацию можно найти на странице Intel 8086 в Википедии.
Мы можем сделать это, используя сложение со сдвигом. мы имеем дело с двумя адресами: логический адрес, который представлен двумя 16-битными адресами, и физический адрес, который является фактическим 20-битным адресом.
Помните, что, поскольку мы имеем дело с шестнадцатеричными числами, каждое число представляет 4 бита.
например мы хотим представить адрес: 7 2 3 A 5
с помощью двух 16-битных адресов, мы можем сделать с помощью двух адресов: 7 2 3 A
и 0 0 0 5
.
Сначала мы сдвигаем первый адрес на четыре бита влево: 7 2 3 A 0
, который называется базовым.
Затем мы добавляем второй адрес: 0 0 0 5
, который называется смещением.
Результатом этой операции является новый 20-битный адрес: 7 2 3 A 5
.
Если нашей базой является CS
, который является началом сегмента кода, а нашим смещением является указатель инструкции IP
, мы можем описать предыдущую операцию следующим образом: (CS << 4) + IP
Примечание: мы можем описать любой 20-битный физический адрес, используя множество логических адресов 16:16, но каждый 2-битный логический адрес будет иметь только один физический адрес.