- •7 Регистры состояния и управления. Флаги
- •9 Формирование физического адреса в реальном режиме
- •10 Жизненный цикл программы на Ассемблере.
- •13 Структура машинной команды. Способы задания операндов.
- •14 Функциональная классификация машинных команд
- •15 Стандартные и упрощенные директивы
- •18 Команды обмена данными с сопроцессором (ldc,stc)
- •19 Ввод - вывод в порт
- •21 Безусловные переход
- •22 Условный переход
- •23 Работа с адресами и указателями памяти
- •24 Преобразование данных
- •25 Организация стека. Команды работы со стеком.
- •27 Сложение двоичных чисел без знака.
- •28 Сложение двоичных чисел со знаком. Вычитание двоичных чисел со знаком.
- •29 Умножение двоичных чисел без знака. Деление двоичных чисел без знака.
- •29 Умножение двоичных чисел со знаком. Деление двоичных чисел со знаком
- •31 32 Сложение вычитание и деление и сложение упакованных bcd чисел
25 Организация стека. Команды работы со стеком.
Стеком называется структура данных организованная по принципу LIFO («Last In — First Out» или «последним пришёл — первым ушёл»). Стек является неотъемлемой частью архитектуры процессора и поддерживается на аппаратном уровне: в процессоре есть специальные регистры (SS, BP, SP) и команды для работы со стеком. Обычно стек используется для сохранения адресов возврата и передачи аргументов при вызове процедур (о процедурах в следующей части), также в нём выделяется память для локальных переменных. Кроме того, в стеке можно временно сохранять значения регистров.
Для стека существуют всего две основные операции:
добавление элемента на вершину стека (PUSH);
Выполняется командой PUSH. У этой команды один операнд, который может быть непосредственным значением, 16-битным регистром (в том числе сегментым) или 16-битной переменной в памяти. Команда работает следующим образом:
значение в регистре SP уменьшается на 2 (так как ширина стека — 16 бит или 2 байта);
операнд помещается в память по адресу в SP.
Примеры:
push -5 ;Поместить -5 в стек
push ax ;Поместить AX в стек
push ds ;Поместить DS в стек
push [x] ;Поместить x в стек (x объявлен как слово)
push word [bx] ;Поместить в стек слово по адресу в BX
извлечение элемента с вершины стека (POP);
27 Сложение двоичных чисел без знака.
Сложение двоичных чисел без знака
Микропроцессор выполняет сложение операндов по правилам сложения двоичных чисел. Проблем не возникает до тех пор, пока значение результата не превышает размерности поля операнда. Например, при сложении операндов размером в байт результат не должен превышать число 255. Если это происходит, то результат оказывается неверным. Рассмотрим, почему так происходит.
К примеру, выполним сложение: 254 + 5 = 259 в двоичном виде. 11111110 + 0000101 = 1 00000011. Результат вышел за пределы 8 бит и правильное его значение укладывается в 9 бит, а в 8-битовом поле операнда осталось значение 3, что, конечно, неверно. В микропроцессоре этот исход сложения прогнозируется и предусмотрены специальные средства для фиксирования подобных ситуаций и их обработки. Так, для фиксирования ситуации выхода за разрядную сетку результата, как в данном случае, предназначен флаг переноса cf. Он располагается в бите 0 регистра флагов EFLAGS/FLAGS. Именно установкой этого флага фиксируется факт переноса единицы из старшего разряда операнда. Естественно, что программист должен учитывать возможность такого исхода операции сложения и предусматривать средства для корректировки. Это предполагает включение участков кода после операции сложения, в которых анализируется флаг cf. Анализ этого флага можно провести различными способами.
Таким образом, после команды вычитания чисел без знака нужно анализировать состояние флага СЕ Если он установлен в 1, то это говорит о том, что произошел заем из старшего разряда и результат получился в дополнительном коде.
Аналогично командам сложения группа команд вычитания состоит из минимально возможного набора. Эти команды выполняют вычитание по алгоритмам, которые мы сейчас рассматриваем, а учет особых ситуаций должен производиться самим программистом. К командам вычитания относятся следующие:
1) dec операнд – операция декремента, т. е. уменьшения значения операнда на 1;
2) sub операнд_1, операнд_2 – команда вычитания; ее принцип действия: операнд_1 = операнд_1 – операнд_2;
3) sbb операнд_1, операнд_2 – команда вычитания с учетом заема (флага ci): операнд_1 = операнд_1 – операнд_2 – значение_сГ.
Как видите, среди команд вычитания есть команда sbb, учитывающая флаг переноса cf. Эта команда подобна adc, но теперь уже флаг cf исполняет роль индикатора заема 1 из старшего разряда при вычитании чисел.
