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

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


examination:asm:question8

Вопрос №8. Структура оперативной памяти. Основные форматы данных: символы, целые и вещественные числа, строки.

Структура оперативной памяти

Сегментная модель памяти

Когда-то давно, на заре рождения компьютерной техники, оперативная память была очень маленькой и для ее адресации использовались 2 байта (так называемое «слово»). Такой подход позволял адресовать 64 Кб памяти, и адресация была линейной - для указания адреса использовалось одно-единственное число. Позже, с усовершенствованием техники, производители поняли, что имеется возможность поддерживать большие объемы памяти, но для этого нужно сделать размер адреса больше. Для совместимости с уже написанным программным обеспечением было решено сделать так: адресация теперь двухкомпонентная (сегмент и смещение), каждая из которых 16-битная, а старые программы как использовали одну 16-битную компоненту и ничего не знают о сегментах, так и продолжают работать. Физический адрес в такой модели вычисляется так: 16 * <сегментный адрес> + <смещение>, таким образом, модель позволяла адресовать от 0 до 16 * 65 535 + 65 535 = 1 114 095, т. е. 1 114 096 байт, что чуть больше 1 Мб. Одно важное свойство сегментной адресации: один и тот же физический адрес можно представить различными комбинациями сегмент + смещение. При этом смещения могут указываться в процессорных командах как непосредственно, так и с помощью регистров, а сегменты непосредственно указываться не могут: для указания сегмента используются специальные 16-битные сегментные регистры CS, DS, SS, ES (сегмент команд, сегмент данных, сегмент стека, дополнительный сегмент). Содержимое сегментных регистров также можно менять (кроме CS - изменить содержимое CS равнозначно дальнему переходу, поэтому для этого и используются дальние переходы).

С появлением 32-битных процессоров необходимость в такой модели отпала и современные 32-битные программы, как правило, с сегментами и сегментными регистрами не работают вообще. Но благодаря принципу совместимости, которого придерживается Intel как «законодатель» архитектур, сегментную модель было решено оставить. Следует отметить, что с появлением 32-битных процессоров сегментная часть адреса осталась 16-битной, а вот смещение стало 32-битным, а также все регистры, кроме сегментных, стали 32-битными. Изменился и принцип вычисления физического адреса: сегмент ни на что не умножается, просто есть специальная таблица, адрес и размер которой «знает» процессор, эта таблица содержит для каждого сегмента стартовый адрес. Так вот, само понятие «сегмент» теперь означает некоторую область данных, начинающуюся с произвольного 32-битного адреса и заканчивающуюся так же произвольным 32-битным адресом, а вышеупомянутая таблица хранит данные об этих сегментах - собственно стартовые адреса и размеры. Номер сегмента в этой таблице (нумерация начинается с нуля) называется селектором. Программист, указывая сегмент и смещение, на самом деле указывает селектор и смещение, а процессор, обращаясь к таблице сегментов, находит там стартовый адрес сегмента и прибавляет к нему смещение. Таким образом, теперь сегменты не обязательно начинаются на 16-байтной границе - их стартовый адрес произволен.

Следует оговориться: 32-битные процессоры имеют два режима работы - реальный и защищенный, и старая модель сегментации работает в реальном режиме процессора, а новая - в защищенном.

Остается добавить, что большинство современного ПО вообще не трогает сегментные регистры - операционная система дает им один-единственный сегмент, которые начинаются с нулевого адреса и заканчиваются 2^32 - 1 (таким образом охватывая всю возможную оперативную память) - и загружает этими данными регистры CS, DS, SS ES.

Виртуальное адресное пространство процесса. Страничная трансляция

С появлением первых версий мультизадачности на 286-х процессорах перед разработчиками ПО встала проблема. Оперативной памяти мало для всех выполняющихся программ! Более того, не было четкого механизма разделения памяти программ - большинство пользовалось общими областями памяти, куда затем любая недружелюбная программа могла записать всё что угодно, испортив данные другой программы. Это давало широкое поле действия для вирусов и прочих вредоносных программ. Нужно было, во-первых, обеспечить полную изоляцию процессов друг от друга, во-вторых, механизмы «подкачки» - сброса неиспользуемых областей памяти на диск, за счет чего освобождалась так необходимая оперативная память. Всё это привело к появлению механизма страничной трансляции.

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

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

Целые числа

Сопроцессор работает с тремя типами целых чисел (рис. 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.

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