Каково назначение регистров CS и IP в сборке Intel 8086?
Итак, как говорится в вопросе, какова цель регистров CS и IP в Intel's 8086?
Я нашел это объяснение:
Кодовый сегмент (CS) - это 16-разрядный регистр, содержащий адрес сегмента 64 КБ с инструкциями процессора. Процессор использует CS-сегмент для всех обращений к инструкциям, на которые ссылается регистр указателя инструкций (IP). Регистр CS нельзя изменить напрямую. Регистр CS автоматически обновляется во время инструкций дальнего перехода, дальнего вызова и дальнего возврата.
и это для IP:
Указатель инструкций (IP) является 16-битным регистром.
Я не очень понимаю, что это в основном означает, так что если бы кто-то мог дать более "яркое" объяснение, это было бы здорово:)
6 ответов
Поскольку указатель инструкций (IP) является 16-битным, это означает, что вы можете иметь только 64k инструкций (2^16), что было немного даже в 80-х годах. Таким образом, чтобы расширить адресное пространство, у вас есть второй регистр, который обращается к блокам 64 КБ. Вы могли бы рассматривать cs:ip вместе как один 32-битный регистр, который затем способен обрабатывать 2^32 байта... т.е. 4G, который вы получаете на процессоре, который использует 32-битные адреса. 8086 использовал 20-битные адреса, поэтому вы могли получить доступ к 1М памяти.
Физический адрес рассчитан из 2-х частей. я) адрес сегмента. II) адрес смещения. CS(регистр сегмента кода) используется для адресации сегмента кода памяти, то есть места в памяти, где хранится код. IP(указатель инструкций) содержит смещение в сегменте кода памяти. Следовательно, CS:IP используется для указания местоположения (т.е. для вычисления физического адреса) кода в памяти.
Следующая инструкция будет выполнена по адресу памяти, равному:
16 * CS + IP
Это позволяет адресовать 20 бит памяти, несмотря на то, что регистры имеют ширину всего 16 бит (и это также создает два различных способа кодирования большинства адресов).
Эффект CS аналогичен эффекту других регистров сегмента. Например, DS
увеличивает доступ к данным (которые не указывают другой сегментный регистр) на 16 * DS
,
CS
Инструкции, которые изменяют CS:
- LJMP (прыжок в длину)
- lcall (дальний вызов), который помещает ip и cs в стек, а затем выполняет дальний переход
- lref (дальний возврат), который инвертирует дальний вызов
- int, который читает IP / CS из таблицы векторов прерываний
- iret, которые обращают int
CS не может меня изменить mov
как и другие сегменты регистров. Попытка закодировать его стандартным идентификатором для CS, что GNU GAS 2.24 делает без жалоб, если вы напишите:
mov %ax, %cs
приводит к недопустимому исключению кода при выполнении.
Чтобы наблюдать эффект от CS, попробуйте добавить следующее в загрузочный сектор и запустить его в QEMU, как описано здесь /questions/8306063/kak-zapustit-programmu-bez-operatsionnoj-sistemyi/8306066#8306066
/* $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 нельзя наблюдать напрямую, поэтому с ним сложнее играть. Проверьте этот вопрос для альтернатив: чтение счетчика программ напрямую
Так как процессор 8086 использует 20-битную адресацию, мы можем получить доступ к 1 МБ памяти, но регистры 8086 составляют только 16 бит, поэтому для доступа к данным из памяти мы объединяем значения, присутствующие в регистрах сегментов кода и регистрах указателей команд, для генерации физический адрес, это делается путем перемещения значения CS 4 бит влево и добавления его к значению IP
ПРИМЕР:
значение CS составляет 1234Hex(шестнадцатеричный гекса)
значение IP 5678Hex
теперь значение CS после перемещения на 4 бита влево равно 12340Hex, затем после добавления значения IP это 179B8Hex, который является физическим адресом
Когда вы пишете.code в тексте вашей программы сборки, этот.code указывает на значение cs. любая команда позже или раньше в файле будет адресована в соответствии с cs:ip, где ip - значение смещения от cs.
Конечно, вы должны иметь в виду, что компилятор ассемблера сначала преобразует текст в инструкции машинного кода.
Регистр IP - IP является указателем инструкций. Его функция такая же, как у ПК (программный счетчик) в другом микропроцессоре, который должен указывать на следующую инструкцию, которая будет извлечена блоком BIU для подачи в блок EU.