Сборник по задачам и примерам Assembler

Вычитание чисел размером 1 байт с учетом знака



Вычитание чисел размером 1 байт с учетом знака

---------------------------------------------------------------------

;sub_sign - процедура вычитания чисел размером 1 байт с учетом знака
;Вход: minuend и deduction - уменьшаемое и вычитаемое.

:Выход: minuend - значение разности.

---------------------------------------------------------------------

.data значения в minuend и deduction нужно внести

N equ 2 :длина в байтах результата в ситуации расширения знака для получения его модуля

minuend db ? -.уменьшаемое

carry db 0 расширение знака

deduction db ? :вычитаемое

.code

sub_sign proc

mov al .deduction

subminuend.al ;оценить результат:

jnc no_carry :нет заема обрабатываем ситуацию заема из старшего разряда - получаем модуль (если нужно)

neg minuend

jmp end_p

no_carry: jns no_sign обрабатываем ситуацию получения отрицательного результата - получаем модуль (если нужно)

neg minuend

jmp end_p

no_sign: jno no_overflow обрабатываем ситуацию переполнения - получаем модуль (если нужно).

расширить результат знаком - получаем модуль (если нужно):

mov carry.0ffh

call calc abs no_overflow:

endjr ret sub_sign endp

Программа учитывает возможный заем из старших разрядов. Вычитание чисел большей размерности (2/4 байта) выполняется аналогично. Необходимо заменить директивы DB на DW/DD и регистр AL на АХ/ЕАХ. Подробности зависимости состояния флагов от результата см. в уроке 8 «Арифметические команды» учебника.



Содержание раздела