Рубрики
Учебный курс

Учебный курс. Урок 9. Сложение и вычитание

После того, как мы изучили механизм представления и обработки чисел процессором, самое время начать знакомство с инструкциями. Ну а к самым простым инструкциям в ассемблере безусловно относятся мнемоники для сложения и вычитания чисел — ADD и SUB.

Сложение — команда ADD

Инструкция ADD выполняет сложение двух операндов. ADD можно «скармливать» числа со знаком и без (такова специфика дополнительного кода). Обязательным правилом является равность операндов по размеру, между собой можно складывать только два 16-битных числа или два 8-битных.

В первый операнд (приемник) будет помещен результат операции сложения. Многие инструкции придерживаются этого правила.

Работа этой инструкции изменяет флаги процессора. В силу того, что результат может выйти за диапазон приемника (переполнение), стать отрицательным, равным нулю и т.д. поведение флагов позволяет следить за результатом выполнения программы. Интерпретация значения флагов во много зависит от того, воспринимает ли программа операнды как числа со знаком или без:

  • Флаг CF становится равным единице, если складываемые операнды являются знаковыми и результат вышел за пределы приемника и случился перенос из старшего разряда. CF = 1 при сложении беззнаковых операндов указывает на переполнение и некорректный результат.
  • Флаг OF = 1 говорит, что произошло переполнение при сложении чисел со знаком.
  • Флаг SF имеет смысл только для операндов со знаком. SF = 1 если результат отрицательный, и SF = 0, если результат положительный. В случае с беззнаковыми операндами он просто получает значение старшего бита приемника.
  • Флаг ZF = 1 указывает, что результат равен нулю.
  • Флаг PF указывает на бинарную четность результата. Это означает что двоичное представление результата содержит четное количество единиц и нулей. Например: 0010111b.

Пример использования команды add:

Вычитание — команда SUB

Инструкция SUB выполняет вычитание операндов. Как и в случае с инструкцией ADD результат операции помещается в первый операнд (приемник). Аналогично изменяются флаги процессора.

На самом деле процессор не умеет вычитать числа. Он все делает через сложение 🙂 Просто перед сложением он подменяет знак второго операнда на противоположный. Так что между инструкциями SUB и ADD даже больше общего.

Ну а чтобы изменить знак числа, когда нам нужно, есть специальная инструкция NEG. Инструкция принимает единственный операнд, знак которого меняется на противоположный.

Примеры использования инструкций SUB и NEG:

Инструкции INC и DEC. Инкремент и декремент

Нередко в теле программы то или иное число нужно увеличить или убавить ровно на единицу. В программировании прибавление к операнду единицы называется инкрементом, а вычитание единицы от операнда — декрементом. Инструкции INC и DEC принимают единственный операнд. Выполнение этих инструкций не меняет значение флага CF, что является важной деталью.

Пример программы

Предлагаю закрепить полученные знания, создав маленькую программу. Нам нужно написать код, который вернет результат вычисления формулы: x = a — (b — c + 1) + (-d). Каждая переменная представляет целое 8-битное число со знаком. Переменные объявим и присвоим им значения в конце кода программы. Пример такой программы:

Обратите внимание, что в коде программы имена переменных обрамлены квадратными скобками. Имя переменной ссылается на адрес, а помещая его в скобки мы говорим компилятору fasm, что нас интересует значение (число) по этому адресу. Так можно считать или переписать значение переменной.

После компиляции программы (процесс описан в Уроке 2. Первая программа) откройте программу в Turbo Debugger. Здесь можно отследить выполнение кода программы шаг за шагом. В окне дампа памяти по адресам переменных будут их значения. Для быстрого перехода к нужному адресу кликните по окну дампа памяти правой кнопкой мыши и в контекстном меню нажмите Goto…

Окно Tourbo Debugger. Переход по адресу 011F

В выделенных байтах памяти без труда угадываются наши переменные:

Окно Turbo Debugger. Значния переменных в дампе памяти

Упражнение

В этом уроке предлагаю вам самостоятельно написать программу для определения значения формулы y = e + 1 — (k — 1 — m). Программа должна оперировать с 16-битными целыми числами со знаком. Чтобы узнать результат вычисления, после компиляции программы откройте её в отладчике, выполните все строки и проверьте, какое значение записалось по адресу переменной y. Не стесняйтесь делиться своими результатами в комментариях к этому уроку 😃

Добавить комментарий