- •Часть 1. Первоначальные сведения об ассемблере и разработке программ для процессора 8086
- •Глава 2. Архитектура процессора 8086
- •Устройство персонального компьютера
- •2.2. Основные сведения о процессоре 8086. Системы счисления, принятые для представления данных в программах на ассемблере
- •Адресация памяти в процессоре 8086
- •2.4. Регистры
- •Глава 3. Загрузка и выполнение программ в dos
- •3.1. Использование dos сегментной организации памяти для загрузки и выполнения программ
- •Процедуры и прерывания. Использование стека при вызове процедур и прерываний
- •Программирование на ассемблере на высоком, среднем и низком уровне
Адресация памяти в процессоре 8086
Числа, устанавливаемые процессором на адресной шине, являются адресами, т.е. номерами ячеек оперативной памяти, из которых необходимо считывать очередную команду или данные. Размер ячейки оперативной памяти составляет 8 разрядов, т.е. 1 байт. Поскольку процессор использует 16-разрядные адресные регистры, то это обеспечивает ему доступ к 65536 (FFFFh) байт или 64К (1К=1024 байт) основной памяти. Такой блок непосредственно адресуемой Памяти называется сегментом. Любой адрес формируется из адреса сегмента (всегда кратен 16) и адреса ячейки внутри сегмента (этот адрес называют смещением). На компьютерах, оснащенных процессором 8086, оперативная память обычно имеет размер, равный 640К. Для того чтобы работать с памятью такого размера, процессор осуществляет пересчет адресов с помощью процедуры, называемой вычислением эффективного адреса (рис.2.3).
Физический 20-разрядный адрес вычисляется сложением сдвинутого влево на 4 разряда 16-разрядного адреса сегмента оперативной памяти со значением 16-разрядного смещения относительно начала этого сегмента. Используя 20-разрядные адреса, можно адресовать 1М оперативной памяти ( 1М=1024К= 1048576 байт). В программе на ассемблере полный адрес записывается в виде
ssss:oooo,
где SSSS – значение адреса сегмента;
Рис.2.3. Вычисление эффективного адреса.
0000 – значение смещения в этом сегменте. Например, физический адрес
000010
можно записать в виде
ooo1:oooo
или
0000:0010.
Это означает, что сегменты жестко не привязываются к определенным адресам памяти и могут частично или полностью перекрываться. Участок оперативной памяти размером 16 байт называется параграфом. Таким образом, адрес начала сегмента всегда выровнен на границу параграфа.
В качестве примера можно Привести физические адреса 00010, 00015 и 00025, представленные в виде двух шестнадцатеричных слов :
Первый адрес Второй адрес Третий адрес
0000:0010 0000:0015 0000:0025
или или или
0001:0000 0001:0005
0001:0015
или 0002:0005
2.4. Регистры
К регистрам общего назначения относятся:
• AX (Accumulate – регистр-аккумулятор);
• ВХ (Base – базовый регистр);
• СХ (Count – регистр счетчика);
• DX (Data – регистр данных);
• SP (Stack Pointer – указатель стека);
• ВР (Base Pointer – указатель базы);
• DI (Destination Index – индекс приемника); .
• SI (Source Index – индекс источника).
Хотя многие команды процессора работают с какими-то определенными регистрами, например команды пересылки строк – с регистрами Dl и SI, умножения и деления – с регистрами DX и АХ, перекодировки – с регистром ВХ и т. д., все регистры общего назначения могут почти без ограничений участвовать в арифметических и логических операциях. Каждый из регистров АХ, ВХ, СХ и DX может рассматриваться не только как один 16-разрядный, но и как два восьмиразрядных. В этом случае байт, содержащий биты с 0 по 7, называется младшим (Low), а с 8 по 15 - старшим (High). Обращение к этим восьмиразрядным регистрам осуществляется по именам АН, AL, ВН, BL, СН, CL, DH и DL.
Следующие регистры называются сегментными и предназначены для хранения значений адресов сегментов:
• CS (Code Segment – сегмент кода);
• DS (Data Segment –сегмент данных);
• SS (Stack Segment – сегмент стека);
• ES (Enhanced Segment – дополнительный сегмент данных).
Значения, находящиеся в регистрах DS, SS и ES, используются совместно со значениями, находящимися в регистрах общего назначения, для вычисления эффективных адресов данных.
Для определения эффективного адреса очередной команды, предназначенной для выполнения процессором, используется значение сегмента, находящееся в регистре CS, и значение смещения, находящееся в регистре адреса команды IP (Instruction Pointer). Регистр IP не может непосредственно использоваться в ассемблерных программах.
Флаговый регистр тоже имеет длину 16 разрядов и используется строковыми, арифметическими и логическими командами, а также для отражения результатов выполнения команд сравнения. Кроме того, содержимое флатового регистра может анализироваться командами условных переходов и самим процессором для выполнения тех или иных действий. Во всех случаях выполняется обращение к отдельным разрядам флагового регистра, называемых флагами, каждый из которых имеет свое название и назначение:
• О (Overflow) – флаг переполнения. Указывает, что в результате выполнения арифметической команды возникло переполнение старшего разряда результата.
• D (Direction) – флаг направления. Определяет, в каком направлении будут пересылаться данные строковыми командами - от младших адресов к старшим или наоборот.
• I (Interrupt) – флаг разрешения прерываний. Указывает на возможность внешних прерываний.
• Т (Trap) – флаг пошагового выполнения. Устанавливает выполнение команд процессора в пошаговом режиме (для отладки программ).
• S (Sign) – знаковый флаг. Содержит знак результата после выполнения арифметических операций (0 = '+', 1 = '-').
• Z (Zero) – флаг ноля. Содержит 1, если результат арифметической операции или операции сравнения ненулевой, в противном случае содержит 0.
• A (Auxiliary) – дополнительный флаг переноса. Используется некоторыми арифметическими командами и содержит значение переноса из 3-го бита восьмибитовых данных.
• Р (Parity) – флаг контроля четности. Содержит 1, если сумма единиц в восьми младших разрядах регистра является четным числом, или 0, если она нечетна (Р=1 для числа 0101 и для ОНО).
• С (Carry) – флаг переноса. Используется арифметическими командами и командами сдвигов.
Ниже приведена схема флагового регистра с обозначением размещения в нем отдельных флагов. Биты, обозначенные как X, программами на ассемблере не используются.
15____________________________________0_ fxTxlxxlOlDlllTlSlZlxlAlxlPlxlCl
