Какова цель регистров CS и IP в сборке Intel 8086?

Итак, как говорится в вопросе, какова цель регистров CS и IP в Intel 8086

Я нашел это объяснение:

Сегмент кода (CS) - это 16-разрядный регистр, содержащий адрес сегмента 64 КБ с процессором инструкции. Процессор использует сегмент CS для всех обращений к инструкциям, на которые ссылается регистр указателя инструкции (IP). Регистр CS не может быть изменен напрямую. Регистр CS автоматически обновляется во время даун-перехода, далеких вызовов и далеких инструкций.

и для IP:

Указатель инструкций (IP) - это 16-разрядный регистр.

Я действительно не понимаю, что это означает в основном, поэтому, если кто-то может дать более "яркое" объяснение, это было бы здорово:)

Ответ 1

Поскольку IP - 16 бит, это означает, что вы можете иметь только 64k инструкций (2 ^ 16), чего не было даже в 80-х годах. Таким образом, чтобы расширить адресное пространство, у вас есть второй регистр, который обращается к блокам 64k. Вы можете рассматривать cs: ip вместе как один 32-разрядный регистр, который затем способен адресовать 2 ^ 32 байта... т.е. 4G, что вы получаете на процессоре, который использует 32-битные адреса. 8086 использовал 20 бит адресов, поэтому вы могли получить доступ к 1 М памяти.

Ответ 2

Физический адрес рассчитывается из 2-х частей. i) адрес сегмента. ii) адрес смещения. CS (регистр сегмента кода) используется для адресации сегмента кода памяти, то есть местоположения в памяти, где хранится код. IP (указатель инструкций) содержит смещение в сегменте кода памяти. Следовательно, CS: IP используется для указания местоположения (то есть для вычисления физического адреса) кода в памяти.

Ответ 3

Инструкция, которая будет выполнена следующей, заключается в том, что по адресу памяти, равному:

16 * CS + IP

Это позволяет адресовать 20 бит памяти, несмотря на то, что регистры имеют ширину всего 16 бит (а также создают два разных способа кодирования большинства адресов).

Эффект CS аналогичен эффекту других регистров сегментов. Например, DS увеличивает доступ к данным (которые не определяют другой регистр сегмента) на 16 * DS.

CS

Инструкции по изменению CS:

  • ljmp (дальний прыжок)
  • lcall (дальний вызов), который подталкивает ip и cs к стеку, а затем далеко прыгает
  • lref (long return), который обращает дальнейший вызов
  • int, который считывает IP/CS из таблицы векторов прерываний
  • iret, который обращает int

CS не может меня изменить с помощью mov, как и другие регистры сегментов. Попытка кодировать его стандартным идентификатором для CS, который GNU GAS 2.24 делает без жалобы, если вы пишете:

mov %ax, %cs

приводит к недопустимому исключению кода при его выполнении.

Чтобы наблюдать эффект CS, попробуйте добавить следующее в загрузочный сектор и запустить его в QEMU, как описано здесь fooobar.com/questions/30228/...

/* $1 is the new CS, $1f the new IP. */
ljmp $1, $after1
after1:
/* Skip 16 bytes to make up for the CS == 1. */
.skip 0x10
mov %cs, %ax
/* cs == 1 */

ljmp $2, $after2
after2:
.skip 0x20
mov %cs, %ax
/* cs == 2 */

IP

IP автоматически увеличивается всякий раз, когда инструкция выполняется по длине кодирования этой команды: вот почему программа движется вперед!

IP модифицируется теми же инструкциями, которые изменяют CS, а также в дальних версиях этих инструкций (более распространенный случай).

IP нельзя наблюдать напрямую, поэтому с ним сложнее играть. Проверьте этот вопрос на альтернативы: Прямой счетчик программы чтения

Ответ 4

Как только вы напишете .code в тексте программы сборки, этот .code указывает на значение cs. любая команда позже или ранее в файле будет адресована как cs: ip, где ip - значение смещения от cs.

Конечно, вы должны иметь в виду, что компилятор сборки сначала преобразует текст в инструкции машинного кода.

Ответ 5

так как процессор 8086 использует 20-битную адресацию, мы можем получить доступ к 1 МБ памяти, но регистры 8086 составляют всего 16 бит, поэтому для доступа к данным из памяти мы объединяем значения, присутствующие в регистре сегмента кода и регистры указателя команд для создания физического адреса, это делается путем перемещения значения CS 4 бит влево, а затем добавив его со значением IP

Пример:

значение CS равно 1234Hex (шестнадцатеричный десятичный знак)

значение IP составляет 5678Hex

теперь значение CS после перемещения 4-х битов осталось 12340Hex, после добавления с IP-значением это 179B8Hex, который является физическим адресом

Ответ 6

IP-регистр - IP - указатель инструкций. Его функция такая же, как ПК (программный счетчик) в другом микропроцессоре, который должен указывать на следующую инструкцию, которую должен получить модуль BIU для подачи в блок ЕС.