Использование флага переноса

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.

Наши рекомендации