Использование флага переноса
I. Сложение с использованием флага переноса.
Рассмотренная ранее инструкция сложения ADD выполняет простое сложение двух беззнаковых кодов. Инструкция ADC складывает три числа: два операнда из регистров общего назначения, как и раньше, плюс значение бита флага переноса из регистра флагов.
Задание.
а) Выполните сложение FFFFh и 1.
б) Затем выполните инструкцию: ADC BX, AX
В результате сложения 1 и 0, в регистре BX будет число 2. (надо пояснить, что останется в регистрах после первой операции).
II. Вычитание с использованием флага переноса.
При выполнении инструкции SBB из разности операндов вычитается значение флага переноса.
Задание.
а) Выполните сложение FFFFh и 1.
б) Затем выполните инструкцию: SBB BX, AX
Флаг нуля.
Занесите в регистры BX и AX два равных числа, теперь инструкцией SUB произведите вычитание одного числа из другого, в результате чего должен быть установлен флаг нуля Z=1 (Zero Flag).
Флаг знака.
Данный флаг позволяет узнать знак числа. Если вычесть из нуля единицу, то результат будет FFFFh, при этом устанавливается флаг знака S=1 (Sign Flag).
Флаг переполнения.
Флаг переполнения устанавливается в той ситуации, когда этого не должно было произойти. Занесите в регистр AX число 7000h, а в BX 6000h и выполните инструкцию сложения, в результате AX будет содержать число D000h или-12288. Это ошибка, так как результат переполняет слово и является отрицательным, поэтому микропроцессор устанавливает флаг переполнения О=1(Overflow Flag)
Контрольные вопросы
1. Каковы задача и содержание этапа отладки программ?
2. Типы программ-отладчиков и особенности их работы.
3. Понятие регистра микропроцессора и машинного слова.
4. Какая инструкция позволяет выполнять сложение целых чисел? Где размещаются операнды и результат?
5. Какова последовательность выполнения инструкции сложения чисел в среде программы Turbo Debugger?
6. Какая инструкция позволяет выполнять вычитание целых чисел? Где размещаются операнды и результат?
7. В каком виде микропроцессор представляет отрицательные числа? Как будет представлен результат выполнения операции 5h – 8h?
8. Поясните особенности представления и именования двухбайтовых регистров общего назначения в виде совокупности двух однобайтовых.
9. Какими особенностями обладает инструкция умножения целых чисел? Где размещаются операнды и результат?
10. Какими особенностями обладает инструкция деления целых чисел? Где размещаются операнды и результат?
11. Поясните, что означает термин "переполнение". Как выяснить, что при выполнении операции произошло переполнение?
12. Что такое флаг, и для чего он нужен?
13. С помощью какой инструкции, и каким образом происходит сложение с учетом флага переноса?
14. С помощью какой инструкции, и каким образом происходит вычитание с учетом флага переноса?
15. Объясните назначение флагов переноса и нуля?
16. Объясните назначение флагов переполнения и знака?
Начальные сведения о языке Ассемблер
Аппаратная поддержка языка
При выполнении программы, микропроцессор взаимодействует с оперативной памятью, где хранятся исполняемая программа и данные, а так же с периферийными устройствами.
Программируемая структура процессора
Для организации вычислений микропроцессор i8086 имеет в своём составе 14 шестнадцатиразрядных регистров, которые обеспечивают выполнение программы:
Регистры общего назначения | Сегментные регистры | Специальные регистры | |||||
AH | AL | AX | CS | SP | Указатель стека | ||
BH | BL | BX | DS | BP | Указатель базы стека | ||
CH | CL | CX | ES | IP | Указатель инструкций | ||
DH | DL | DX | SS | FLAGS | Регистр флагов | ||
SI | |||||||
DI |
Регистры общего назначения:
AX(AH, AL), BX(BH, BL), CX(CH, CL), DX(DH, DL) делятся программно на пары однобайтных регистров и могут использоваться для хранения данных. Разбиение на однобайтные регистры позволяет увеличить общее число регистров;
SP, BP – указатель и база стека, соответственно, обеспечивают доступ к данным в стеке, могут использоваться для хранения данных, но делать это не рекомендуется, так как при этом возможно нарушение адресации в стеке, особенно при использовании SP.
SI, DI – шестнадцатиразрядные регистры для хранения данных.
CS, DS, ES, SS – хранят адреса сегментов в памяти, не могут использоваться для хранения данных.
IP – регистр инструкций – хранит адрес (смещение) следующей исполняемой команды.
FLAGS – регистр флагов содержит набор битовых флагов, определяющий текущее состояние процессора и результат выполнения предыдущей команды (таблица 2.1).
Таблица 2.1 | ||
Регистр флагов процессора | ||
Флаг | Название | Назначение |
О | Переполнение | Переполнение при выполнении арифметических операций |
D | Направление | Направление пересылки данных при выполнении строковых команд |
I | Прерывание | Разрешает/Запрещает внешние прерывания |
T | Пошаговый режим | Останов после выполнения каждой команды(используется отладчиками) |
S | Знак | Знак результата выполненной команды(0 – плюс, 1 – минус) |
Z | Ноль | Значение результата выполненной команды(0 – ненулевой, 1 – нулевой) |
A | Внешний перенос | Используется для специальных арифметических операций |
P | Контроль чётности | Число единиц в операнде(0 – нечётное, 1 – нечётное) |
C | Перенос | Содержит перенос из старшего бита при выполнении арифметических операциях |
Структура памяти
Память, с которой взаимодействует процессор при обработке программ, называется Оперативным Запоминающим Устройством (ОЗУ) или Random Access Memory (RAM). Она состоит из набора однобайтных ячеек, обращение к которым происходит по их номерам (физическим адресам). Число ячеек зависит от ширины шины адреса и составляет для процессора i8086 (ширина шины адреса равна 20) 220 – ячеек (1Мбайт). Для современных процессоров с шириной шины адреса 32 объём ОЗУ может доходить до 4 Гбайт.
Данные можно читать или сохранять в ОЗУ байтами, указывая номер требуемой ячейки или словами (2 байта), указывая адрес младшей ячейки памяти и вводя специальный префикс.
Сегментация памяти
Для обращения к памяти процессор предварительно помещает адрес ячейки в один из своих регистров, но для процессора i8086, очевидно нельзя в шестнадцатиразрядном регистре хранить двадцатиразрядный адрес. Поэтому применяют так называемую сегментацию памяти, которая заключается в том, что истинный, физический адрес ячейки хранится в двух регистрах.
Один из них – сегментный, он хранит адрес начала блока памяти, который и называется сегментом. Если к шестнадцати разрядам сегмента мысленно справа дописать четыре двоичных нуля(16+4=20), то получим физический адрес начала сегмента в ОЗУ. Второй регистр хранит величину смещения адреса требуемой ячейки от начала сегмента. Адрес ячейки памяти записывается в виде двойного слова (4 байта): <сегмент>:<смещение>.
Сегмент всегда начинается с ячейки, номер которой заканчивается на 4 двоичных (или один шестнадцатеричный) нуля. Минимальная длина сегмента 16 байтов (параграф). Максимальная длина определяется длиной регистра, хранящего смещение и равна 216(64 Кбайта).
Пара регистров CS:IP(<сегмент>:<смещение>) определяют адрес следующей команды программы.
Для адресации данных используются сегментные регистры DS и ES, а в качестве регистров, хранящих смещение, используются регистры общего назначения BX, SI, DI. Для работы с сегментом стека используют сегментный регистр SS и регистр BP.