Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по архитектуре.docx
Скачиваний:
8
Добавлен:
16.04.2019
Размер:
258.32 Кб
Скачать

48. Сегментная организация памяти. Кодирование команд.

Перед тем как изучать регистры и команды процессора 8086, необходимо по­нять, как он адресует память, используя системные сегменты и смещения — терми­ны, часто вызывающие недоразумения.

Используя для представления значения адреса 20 бит, 8086-й процессор может иметь прямой доступ к 1 Мбайт памяти.DOS, ROMBIOS и другие находящиеся в памяти программы уже занимают определенное место памяти персонального ком­пьютера, поэтому остальные программы запускаются, используя меньшее про­странство памяти — до 640 Кбайт. Если вы хотите, чтобы ваша программа работа­ла на возможно большем числе компьютеров — ограничьте пределы необходимой памяти.

1.1 Замечание

Последние модели процессов, такие как 80386, 80486 и Pentium(известный как 80586), эмулируют режим процессора 8086. Методы, описанные в этой главе, применимы ко всем процессорам 80х86.

1.2 Программирование на языке ассемблера

Для определения начал сегментов памяти процессор 8086 использует четыре 16-битовьк сегментных регистра. Для создания 20-битового физического адреса процессор объединяет значение одного сегментного регистра с 16-битовым смещением (логическим адресом). Это делается путем умножения сегментного значения на 16 (сдвиг влево на 4 бита) и прибавлением к результату смещения (умножение на 16 эквивалентно четырехкратному сдвигу битов влево). Исходя из этого, получается, что границы сегментов располагаются через каждые 16 байт физических адресов. Каждый из этих 16-байтовых фрагментов называется параграфом. Простые вычисления показывают, что максимально может существовать 65536 параграфов и, следовательно, такое же число границ сегментов в одномегабайтовом адресном пространстве процессора 8086 (1048576/16). (Заметим, что это также равняется числу значений, которые могут быть выражены с помощью одного 16-битового сегментного ре­гистра.) Кроме того, запомните несколько важных сведений о сегментах.

• Сегменты физически не выделены в памяти, что является общим заблуждением. Сегменты — это логические окна, через которые программы просматривают области памяти удобными, в 64 Кбайт порциями. ^

• Начальное положение сегмента (т.е. логический адрес) определяется вами и может иметь любое значение от | 0000 доFFFF в шестнадцатеричном представлении. Каждое логическое значение сегмента (0,'1, 2,..., 65535), соответствует физической границе параграфа (0,16, 32,..., 1048560).

• Размеры сегментов могут изменяться от 16 байт до 64 Кбайт (65536 байт). Действительный размер сегмента определяется вами и вашей программой.

• Сегменты не обязательно располагаются физически в памяти один за другим, хотя так бывает достаточно часто.

• Сегменты могут перекрываться один другим; поэтому один и тот же байт в памяти может иметь различные логические адреса, определяемые разными, но при этом эквивалентными парами сегмент-смещение. Но, не­смотря на это, каждый байт имеет только единственный 20-битовый физический адрес. Почти всех, кто впервые знакомится с сегментацией памяти, этот последний пункт приводит в замешательство. Две разные пары сегмент-смещение могут (и так часто бывает) указывать в памяти на один и тот же байт. Если вы вспомните, как процессор создает 20-битовые физические адреса — умножением значения сегмента на 16 и прибав­лением смещения, вы увидите, что шестнадцатеричные значения пар сегмент-смещение 0000:0010 и 0001:0000 ука­зывают на одну и ту же физическую область памяти. Если повторить процесс преобразования этих логических ад­ресов в физические в десятичной системе счисления, то при вычислении (0000х16)+1б и (0001х16)+0 получается один и тот же результат –16.