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

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

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

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

и это для IP:

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

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

6 ответов


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


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


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

16 * CS + IP

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

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

CS

инструкции, которые изменяют CS:

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

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

mov %ax, %cs

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

чтобы наблюдать эффект CS, попробуйте добавить следующее В загрузочный сектор и запустить его в QEMU, как описано здесь https://stackoverflow.com/a/32483545/895245

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

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

IP

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

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

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


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

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


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

пример:

значение CS 1234Hex(hexa decimal)

значение IP 5678Hex

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


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