Сложение неупакованных BCD – чисел

Рассмотрим пример программы, которая изображена на слайде. Данная программа складывает 2-разрядные числа из-за строки:

Lenequ 2, вместо числа 2 можно указать необходимое количество разрядов.

Sumdb 3 dup(0) – будет хранить результат сложения. Sumимеет длину три байта, потому что результат сложения 2-разрядных чисел может быть и 3-разрядным.

Moval, byteptrb[bx] – данной командой переносим в регистр alмладший разряд первого числа в регистр al.

Adcal, byteptrc[bx] – складываем содержимое регистра alc младшим разрядом второго числа. Почему используется команда adc, а не команда add? Потому что данная команда устанавливает флаг cfнужным образом, то есть если результат сложения превышает 10, то cf = 1, и при следующем использовании команды adc, будет учтено, что необходимо прибавить содержимое флага cf к результату сложения, вследствие переноса единицы при сложении младших разрядов. Как мы помним, при сложении чисел, чья сумма превышает 10, результат будет некорректным, поэтому следующая команда:

Ааа – коррекция результата сложения.

Incbx – увеличивает значение регистра bxна 1. Важным аспектом команды incявляется то, что она не изменяет значение флага cf, с помощью которого команда adcследит за переносом единицы.

Loopm1 – продолжение цикла, так как число имеет несколько разрядов.

Adcbyteptrsum[bx], 0 – Как говорилось ранее, при сложении 2-разрядных чисел, результат может быть уже 3-разрядным. Этой командой мы заносим в 3 разряд содержимое флага cf (в третий, потому что после выхода из цикла содержимое bxстало равняться 3), учитывая таким образом возможный перенос единицы в 3 разряд.

Рассмотрим пример аналогичной программы, сделанной на командах для сопроцессора, который приведен на слайде (сопроцессор и его команды будут рассмотрены в следующих лекциях). Как мы видим программа, выполняющая аналогичные функции составляет гораздо меньше команд. При этом для сопроцессора не нужно указывать разрядность чисел, и максимальная разрядность чисел составляет 18.

Ссылка на основную публикацию
Adblock detector