ЭВМ IBM PC в вопросах и ответах
ЭВМ IBM PC в вопросах и ответах
В чем суть сегментной организации.
Суть сегментной адресации заключается в следующем. Обращение к памяти осуществляется исключительно с помощью сегментов - логических образований, накладываемых на те или иные участки физической памяти. Исполнительный адрес любой ячейки памяти вычисляется процессором путем сложения начального адреса сегмента, в котором располагается эта ячейка, со смещением к ней (в байтах) от начала сегмента (рис. 1.4). Это смещение иногда называют относительным адресом.
Рис. 1.4. Образование физического адреса из сегментного адреса и смещения.
Начальный адрес сегмента без четырех младших битов, т.е. деленный на 16, помещается в один из сегментных регистров и называется сегментным адресом. Сам же начальный адрес хранится в специальном внутреннем регистре процессора, называемом теневым регистром. Для каждого сегментного регистра имеется свой теневой регистр; начальный адрес сегмента загружается в него процессором в тот момент, когда программа заносит в соответствующий сегментный регистр новое значение сегментного адреса.
Процедура умножения сегментного адреса на 16 (или, что то же самое, на 10h) является принципиальной особенностью реального режима, ограничивающей диапазон адресов, доступных в реальном режиме, величиной 1 Мбайт. Действительно, максимальное значение сегментного адреса составляет FFFFh, или 64К-1, из чего следует, что максимальное значение начального адреса сегмента в памяти равно FFFF0h, или 1 Мбайт - 16. Если, однако, учесть, что к начальному адресу сегмента можно добавить любое смещение в диапазоне от 0 до FFFFh, то адрес последнего адресуемого байта окажется равен 10FFEFh, что соответствует величине 1 Мбайт + 64 Кбайт - 17.
Диапазон адресов, формируемых процессором, называют адресным пространством процессора; как мы видим, в реальном режиме он немного превышает 1 Мбайт. Заметим еще, что для описания адреса в пределах 1 Мбайт требуются 20 двоичных разрядов, или 5 шестнадцатеричных. Процессор 8086 имел как раз 20 адресных линий и не мог, следовательно, выйти за пределы 1 Мбайт; современным 32-разрядным процессорам, если они работают в реатьном режиме, доступно несколько большее (почти на 64 Кбайт) адресное пространство. Если же процессор работает в защищенном режиме (с использованием 32-разрядных регистров), то его адресное пространство увеличивается до 232 = 4 Гбайт.
Сегментом называется область памяти, которая начинается на
границе параграфа, то есть в любой точке, адрес которой кратен
16 (восемь младших битов равны нулю).
Существуют три основных типа сегментов:
- сегмент кода - содержит машинные команды, адресуется ре-
гистром CS;
- сегмент данных - содержит данные, то есть константы и
рабочие области, необходимые программе.
Адресуется регистром DS;
- сегмент стека - содержит адреса возврата в точку вызова
подпрограмм. Адресуется регистром SS.
Каждый из упомянутых регистров содержит адрес начала сег-
мента (базовый адрес). В программе все адреса записаны относи-
тельно начала сегмента, и они определяются как смещение
(offset) от начала сегмента. Двухбайтовое смещение (одно слово)
может принимать значение от 0000 до 0FFFFh. Для того, чтобы вы-
полнить обращение по любому адресу процессор выполняет суммиро-
вание адреса, записанного в регистре сегмента, со смещением.
При этом, содержимое регистра сдвигается на четыре двоичных
разряда влево. Результирующий адрес занимает 20 позиций, что и
позволяет адресовать 1 Мбайт памяти.
Пример.
Содержимое DS 045F
+
Смещение 0032
------
Исполнительный 04622
адрес (EA)
Примечание: Адреса шестнадцатиричные.
Можно ли допустить одинаковые адреса у памяти и внешнего устройства.
Можно, т.к. обращение к этим адресам осуществляется при помощи разных команд.
Структура байта-атрибута.
Байт атрибутов, как для монохромного, так и для графического дисплея в текстовом (не графическом) режиме определяет характеристики каждого отображаемого символа. Байт-атрибут имеет следующие 8 бит:
Фон Текст
Атрибут: BL R G B I R G B
Номер битов: 7 6 5 4 3 2 1 0
Буквы RGB представляют битовые позиции, управляющие красным (red), зеленым (green) и синим (blue) лучем в цветном моноторе. Бит 7 (BL) устанавливает мигание, а бит 3 (I) - уровень яркости. На монохромных мониторах текст высвечивается зеленым или оранжевым на темном фоне, хотя в данной главе такое изображение называется черно-белым (BW).
Для модификации атрибутов можно комбинировать биты следующим oбразом:
Эффект выделения Фон Текст
RGB RGB
Неотображаемый (черный по черному) 000 000
Подчеркивание (не для цвета) 000 001
Нормальный (белый по черному) 000 111
Инвертированный (черный по белому) 111 000
Цветные мониторы не обеспечивают подчеркивания; вместо этого установка бит подчеркивания выбирает синий цвет для текста и получается отображение синим по черному. Ниже приведены некоторые атрибуты, основанные на комбинации битов фона, текста, мигания и выделения яркостью:
Двоичный Шест. Эффект выделения
код код
00000000 00 Неотображаемый (для паролей)
0000111 07 Белый по черному (нормальный)
10000111 87 Белый по черному (мигание)
00001111 0F Белый по черному (яркий)
01110000 70 Черный по белому (инвертированый)
11110000 F0 Черный по белому (инверт. мигающий)
Эти атрибуты подходят для текстового режима, как для монохромных, так и для цветных дисплеев. В следующей главе будет показано, как выбирать конкретные цвета. Для генерации атрибута можно использовать команду INT 10H. При этом регистр BL должен содержать значение байта-атрибута, а регистр AH один из следующих кодов: 06 (прокрутка вверх), 07 (прокрутка вниз), 08 (ввод атрибута или символа), 09 (вывод атрибута или символа). Если программа установила некотоpый атрибут, то он остается таким, пока программа его не изменит. Если установить значение байта атрибута равным шест.00, то символ вообще не будет отображен.
SUB
(SUBtract) Вычитание
Схема команды: | sub операнд_1,операнд_2 |
Назначение: целочисленное вычитание.
Алгоритм работы:
· выполнить вычитание операнд_1=операнд_2-операнд_1;
· установить флаги.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
r | r | r | r | r | r |
Применение:
Команда sub используется для выполнения вычитания целочисленных операндов или для вычитания младших частей значений многобайтных операндов.
;пример фрагмента программы, в которой ;выполняется вычитание 64-битных значений: vich_1-vich_2vich_1 dd 2 dup (0)vich_2 dd 2 dup (0)rez dd 2 dup (0)...;ввести значения в поля vich_1 и vich_2:;младший байт по младшему адресу... mov eax,vich_1 sub eax,vich_2 ;вычесть младшие половинки чисел mov rez,eax ;младшая часть результата mov eax,vich_1+4 sbb eax,vich_2+4 ;вычесть старшие половинки чисел mov rez+4,eax ;старшая часть результата |
SBB
(SuBtract with Borrow) Вычитание с заемом
Схема команды: | sbb операнд_1,операнд_2 |
Назначение: целочисленное вычитание с учетом результата предыдущего вычитания командами sbb и sub (по состоянию флага переноса cf).
Алгоритм работы:
· выполнить сложение операнд_2=операнд_2+(cf);
· выполнить вычитание операнд_1=операнд_1-операнд_2;
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
r | r | r | r | r | r |
Применение:
Команда sbb используется для выполнения вычитания старших частей значений многобайтных операндов с учетом возможного предыдущего заема при вычитании младших частей значений этих операндов.
;пример фрагмента программы, в которой ;выполняется вычитание 64-битных значений: vich_1-vich_2vich_1 dd 2 dup (0)vich_2 dd 2 dup (0)rez dd 2 dup (0)...;ввести значения в поля vich_1 и vich_2:;младший байт по младшему адресу... mov eax,vich_1 sub eax,vich_2 ;вычесть младшие половинки чисел mov rez,eax ;младшая часть результата mov eax,vich_1+4 sbb eax,vich_2+4 ;вычесть старшие половинки чисел mov rez+4,eax ;старшая часть результата |
DIV
(DIVide unsigned) Деление беззнаковое
Схема команды: | div делитель |
Назначение: выполнение операции деления двух двоичных беззнаковых значений.
Алгоритм работы:
Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно и размер его зависит от размера делителя, который указывается в команде:
· если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;
· если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;
· если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
? | ? | ? | ? | ? | ? |
Применение:
Команда выполняет целочисленное деление операндов с выдачей результата деления в виде частного и остатка от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.
;пример фрагмента программы деления ;двух чисел с помощью команды div mov ax,10234 mov bl,154 div bl ;ah=остаток, al=частное |
MUL
(MULtiply) Умножение целочисленное без учета знака
Схема команды: | mul множитель_1 |
Назначение: операция умножения двух целых чисел без учета знака.
Алгоритм работы:
Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя, который может быть расположен в памяти или в регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:
· если операнд, указанный в команде — байт, то второй сомножитель должен располагаться в al;
· если операнд, указанный в команде — слово, то второй сомножитель должен располагаться в ax;
· если операнд, указанный в команде — двойное слово, то второй сомножитель должен располагаться в eax.
Результат умножения помещается также в фиксированное место, определяемое размером сомножителей:
· при умножении байтов результат помещается в ax;
· при умножении слов результат помещается в пару dx:ax;
· при умножении двойных слов результат помещается в пару edx:eax.
Состояние флагов после выполнения команды (если старшая половина результата нулевая):
OF | SF | ZF | AF | PF | CF |
? | ? | ? | ? |
Состояние флагов после выполнения команды (если старшая половина результата ненулевая):
OF | SF | ZF | AF | PF | CF |
? | ? | ? | ? |
Применение:
Команда mul выполняет целочисленное умножение операндов без учета их знаковых разрядов. Для этой операции необходимо наличие двух операндов-сомножителей, размещение одного из которых фиксировано, а другого задается операндом в команде. Контролировать размер результата удобно используя флаги cf и of.
;пример фрагмента программы целочисленного умножения ;без учета знака mn_1 db 15mn_2 db 25... mov al,mn_1 mul mn_2 |
ЭВМ IBM PC в вопросах и ответах