Инструменты пользователя

Инструменты сайта


examination:asm:question5

Вопрос №5. Основные форматы команд и данных. Принципы адресации, правила вычисления физического адреса. Примеры

Форматы команд

Алгоритм, написанный пользователем программы, в конечном счете реализуется в виде машинных команд. Под командой понимают совокупность сведений, представленных в виде двоичных кодов, необходимых процессору для выполнения очередного шага. В ходе команды для сведений о типе операции, адресной информации о нахождении обрабатываемых данных, а также для информации о месте хранения результатов выделяются определенные разряды (поля).

Форматом команды называется заранее обговоренная структура полей в её кодах, позволяющая ЭВМ распознавать составные части кода.

Форматом команды называется заранее обговоренная структура полей в её кодах, позволяющая ЭВМ распознавать составные части кода.

Главным элементом кода команды является код операции (КОП), что определяет, какие действия будут выполнены по данной команде. Под него выделяется N старших разрядов формата. В остальных разрядах размещаются А1 и А2 v адреса операндов. А3 - адрес результата.

Распределение полей в формате команды может изменяться при смене способа адресации. Длина команды зависит от числа адресных полей. По числу адресов команды делятся на:

  • безадресные
  • одно-, двух-, трехадресные

Длина кода команды измеряется в машинных словах. Чтобы получить возможность работать с минимальным числом адресных полей, результат, к примеру, можно размещать по месту хранения одного из операндов. Либо предварительно размещают один или несколько операндов в специально выделенных регистрах процессора.

Основные форматы данных

Целые числа

Сопроцессор работает с тремя типами целых чисел (рис. 17.5).

В табл. 17.1 представлены формат целых чисел, их размерность и диапазон значений.

Выбирая формат данных, с которыми будет работать ваша программа, помните, что сопроцессор поддерживает операции с целыми числами, но работа с ними осуществляется неэффективно. Причина в том, что обработка сопроцессором целочисленных данных будет замедлена из-за дополнительного преобразования целых чисел в их внутреннее представление в виде эквивалентного вещественного числа расширенного формата.

В программе целые двоичные числа описываются обычным способом — с использованием директив DW, DD и DQ. Например, целое число 5 может быть описано следующим образом:

ch_dw 5 представление в памяти: ch_dw=05 00 ch_dd 5 представление в памяти: ch_dw=05 00 00 00 ch_dq 5 представление в памяти: ch_dw=05 00 00 00 00 00 00 00

Работать с целыми числами может далеко не всякая команда сопроцессора.

Вещественные числа

Основной тип данных, с которыми работает сопроцессор, — вещественный. Данные этого типа описываются тремя форматами: коротким, длинным и расширенным (рис. 17.7).

Для представления вещественного числа используется следующая формула:

А - (+ М) •N+(p) (17.1)

Здесь:

  • М — мантисса числа А (мантисса должна удовлетворять условию | М \ < 1);
  • N— основание системы счисления, представленное целым положительным числом;
  • р — порядок числа, показывающий истинное положение точки в разрядах мантиссы (по этой причине вещественные числа имеют еще название чисел с плавающей точкой, так как ее положение в разрядах мантиссы зависит от значения порядка).

Символы и строки

Как вы уже знаете, компьютер может оперировать только двоичными числами. Поэтому у вас может возникнуть вопрос: как же тогда в нем должны храниться символьные данные? Для этого нужно заранее определить таблицу символов, с помощью которой будет установлено взаимно однозначное соответствие между символами алфавита и целыми числами. До недавнего времени коды, составляющие таблицы символов, были 8-разрядными. Однако поскольку в мире существует огромное количество языков, имеющих совершенно разную структуру, для их поддержки в компьютере была создана универсальная 16-разрядная кодовая таблица, которую назвали Unicode.

При работе в текстовом режиме, таком как сеанс MS DOS, в совместимых с IBM PC компьютерах используется стандартная таблица символов ASCII. Эта аббревиатура расшифровывается как American Standard Codefor Information Interchange, или Американский стандартный код обмена информацией. В таблице ASCJI каждому символу назначается стандартный уникальный 7-разрядный двоичный код.

Так как в ASCII -кодах используются только младшие 7 битов каждого байта, то дополнительный 8-й бит может использоваться на различных компьютерных платформах для поддержки локальной таблицы символов. Например, в совместимых с IBM PC компьютерах значения кодов ASCII-таблицы в диапазоне от 128 до 255 используются для представления псевдографических символов, а также символов греческого алфавита.

ASCII-строки. Последовательность одного или нескольких символов называется строкой. Строки в формате ASCII (или ASCII-строки) хранятся в памяти компьютера в виде последовательности байтов, содержащих ASCII-коды. Например, текстовой строке «ABC123» соответствует последовательность байтов, заданных в шестнадцатеричном виде (об этом свидетельствует символ «h», указанный в конце числа): 41h, 42h, 43h, 31h, 32h и 33h. Если в конце последовательности символов находится байт, содержащий нулевое значение OOh, такая строка называется нуль-завершенной (nulI-terminated) и обозначается как ASCIIZ. Нуль-завершенные строки широко используются в таких языках программирования, как С и С++. Кроме того, эти строки в формате ASCIIZ часто передаются в виде параметров при вызове функций oпepaциoнныx MS DOS и Windows.

Адресация памяти в семействе процессоров IA-32

В семействе процессоров IA-32 выбор метода обращения к памяти определяется режимом работы процессора.

В реальном режиме процессор может обращаться только к первому мегабайту памяти, адреса которого находятся в диапазоне от 00000 до FFFFF в шестнадцатеричном выражении. При этом процессор работает в однопрограммном режиме (т.е. в заданный момент времени он может выполнять только одну программу). Однако при этом он может в любой момент прервать ее выполнение и переключиться на процедуру обработки запроса (его называют прерыванием), поступившего от одного из периферийных устройств. Любой программе, которую выполняет в этот момент процессор, разрешен доступ без ограничения к любым областям памяти, находящимся в пределах первого мегабайта: к ОЗУ — по чтению и записи, а к ПЗУ, понятно, только по чтению. Реальный режим работы процессора используется в операционной системе MS DOS, а также в системах Windows 95 и 98 при загрузке в режиме эмуляции MS DOS.

В защищенном режиме процессор может одновременно выполнять несколько программ. При этом каждому процессу (т.е. выполняющейся программе) может быть назначено до 4 Гбайт оперативной памяти. Чтобы предотвратить взаимное влияние выполняющихся программ друг на друга им выделяются изолированные участки памяти (т.е. код и данные программ находятся во взаимно несмежных сегментах). В защищенном режиме работают такие ОС, как MS Windows и Linux.

В виртуальном режиме адресации процессора 8086, последний на самом деле работает в защищенном режиме. Для каждой задачи создается собственная виртуальная машина, которой выделяется изолированная область памяти размером 1 Мбайт, и полностью эмулируется работа процессора 80×86 в реальном режиме адресации. Например, в операционных системах Windows 2000 и ХР виртуальная машина процессора 8086 создается каждый раз при запуске пользователем окна командного интерпретатора (сеанса MS DOS). При этом одновременно можно запустить довольно много таких окон, причем выполняющиеся в них программы не будут влиять друг на друга. Однако не стоит обольщаться, часть программ, написанных для системы MS DOS и реального режима адресации, напрямую взаимодействуют с аппаратным обеспечением компьютера. Поэтому они не будут работать в среде ОС Windows 2000 и ХР.

Вычисление 20-разрядного линейного адреса

По сути, адрес ячейки памяти — это обычное число, указывающее ее порядковый номер относительно начала памяти, т.е. нулевого адреса. Как уже было сказано, в реальном режиме линейный (т.е. абсолютный) адрес имеет длину 20 битов, а его значение может на¬ходиться в диапазоне от 00000 до FFFFF B шестнадцатеричном представлении. Однако в самих 16-разрядных программах непосредственно оперировать линейными адресами нельзя. Поэтому абсолютные адреса ячеек памяти задаются в них в виде двух 16-разрядных чисел, определяющих адрес в форме «сегмент-смещение» следующим образом:

  • 16-разрядный адрес начала сегмента помещается в один из шести сегментных регистров (CS, DS, ES, SS, FS или GS), который явным или неявным образом указывается при выполнении каждой команды;
  • программы непосредственно оперируют только 16-разрядным смещением, указанным относительно начала сегмента.

Адреса, заданные в программах в форме «сегмент-смещение», автоматически преобразуются ЦПУ в 20-разрядные линейные адреса в процессе выполнения команды.

Пример. Предположим, что адрес некоторой переменной, заданный в шестнадцатеричном виде и в форме «сегмент-смещение», равен 08Fl:0100. При вычислении линейного адреса ЦПУ должен умножить сегментную часть адреса на 10h (сдвиг влево на 4 бита) и прибавить к полученному результату смещение, как показано ниже:

08F1 * 10 = 08F10 (Линейный адрес начала сегмента)

К адресу начала сегмента: 0 8 F 1 0 Прибавляем смещение: 0 1 0 0 Получаем линейный адрес: 0 9 0 1 0

В типичной программе, написанной для процессоров семейства IA-32, как правило, есть три сегмента: кода, данных и стека. При запуске программы их базовые сегментные адреса погружаются в регистры CS, DS и SS, соответственно. В трех оставшихся регистрах ES, FS и GS программа может хранить указатели на дополнительные сегменты.

Формирование физического адреса (в реальном режиме)

Далее перечислены характеристики механизма адресации физической памяти в реальном режиме.

  • Диапазон изменения физического адреса — от 0 до 1 Мбайт. Эта величина определяется тем, что шина адреса i8086 имела 20 линий.
  • Максимальный размер сегмента— 64 Кбайт. Это объясняется 16-разрядной архитектурой 18086. Нетрудно подсчитать, что максимальное значение, которое могут содержать 16-разрядные регистры, составляет 216 - 1, что применительно к памяти и определяет величину 64 Кбайт.
  • Для обращения к конкретному физическому адресу оперативной памяти необходимо определить адрес начала сегмента (сегментную составляющую) и смещение внутри сегмента.

Понятие адреса начала сегмента ввиду принципиальной важности требует дополнительного пояснения. Исходя из разрядности сегментных регистров, можно утверждать, что сегментная составляющая адреса (или база сегмента) представляет собой всего лишь 16-разрядное значение, помещенное в один из сегментных регистров. Максимальное значение, которое при этом получается, соответствует 216 - 1. Если так рассуждать, то получается, что адрес начала сегмента может быть только в диапазоне 0-64 Кбайт от начала оперативной памяти. Возникает вопрос, как адресовать остальную часть оперативной памяти вплоть до 1 Мбайт с учетом того, что размер самого сегмента не превышает 64 Кбайт. Дело в том, что в сегментном регистре содержатся только старшие 16 битов физического адреса начала сегмента. Недостающие младшие четыре бита 20-разрядного адреса получаются сдвигом значения в сегментном регистре влево на 4 разряда. Эта операция сдвига выполняется аппаратно и для программного обеспечения абсолютно прозрачна.

Получившееся 20-разрядное значение и является настоящим физическим адресом, соответствующим началу сегмента. Что касается второго компонента (смещения), участвующего в образовании физического адреса некоторого объекта в памяти, то он представляет собой 16-разрядное значение. Это значение может содержаться явно в команде либо косвенно в одном из регистров общего назначения. В процессоре эти две составляющие складываются на аппаратном уровне, в результате получается физический адрес памяти размерностью 20 битов. Данный механизм образования физического адреса позволяет сделать программное обеспечение перемещаемым, то есть не зависящим от конкретных адресов загрузки его в оперативной памяти (рис. 2.8).

Формирование физического адреса в защищенном режиме

Физический адрес формируется следующим образом. В сегментных регистрах хранится селектор, содержащий индекс дескриптора в таблице дескрипторов (13 бит), 1 бит, определяющий к какой таблице дескрипторов будет производиться обращение (к локальной или к глобальной) и 2 бита запрашиваемого уровня привилегий. Далее происходит обращение к соответствующей таблице дескрипторов и соответствующему дескриптору, который содержит начальный 24-битный адрес сегмента, размер сегмента и права доступа, после чего вычисляется необходимый физический адрес путём сложения адреса сегмента со смещением из 16-разрядного регистра

examination/asm/question5.txt · Последние изменения: 2014/01/15 08:13 (внешнее изменение)