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

     

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



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

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

:sub_sign_N - процедура вычитания чисел размером Н байт с учетом знака

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

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

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

minuenddb ? уменьшаемое

lenjninuend=$-minuend ;длина в байтах уменьшаемого и вычитаемого

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

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

.code

sub_sign_N proc

mov cx.lenjninuend



mov si.O @@ml: mov al,deduction[si]

sbb minuend[si].al

inc si

loop @@ml оценить результат:

jnc no_carry :нет заема

обрабатываем ситуацию заема из старшего разряда - получаем модуль (если нужно) N=1en_minuend+1

mov carry.0ffh

call calc_abs

jmp end_p no_carry: jns no_sign Обрабатываем ситуацию получения отрицательного результата -

:получаем модуль (если нужно) N=1en_minuend

call calc_abs

jmp end_p

no_sign: jno no_overflow

обрабатываем ситуацию переполнения - получаем модуль (если нужно) расширить результат знаком - получаем модуль (если нужно): N=1en_minuend+1

mov carry,0ffh

call catc_abs no_overflow: end_p: ret sub_sign_N endp

Описанная процедура вычисляет модуль разности и учитывает возможный заем из старших разрядов. Если вычисления модуля разности не требуется, то закомментируйте строки, содержащие команду CALL calc_abs. Подробности зависимости состояния флагов от результата см. в уроке 8 «Арифметические команды» учебника.

Сегмент данных может быть задан, например, так:

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

minuend db 25h,0f4h,0eh уменьшаемое

len_minuend=$-minuend ;длина в сайтах уменьшаемого и вычитаемого

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

deduction db 5h,0f4h,0fh :вычитаемое

Далее при рассмотрении программы деления многобайтных двоичных чисел нам понадобится макрокоманда вычитания с учетом знака чисел размером N байт (порядок следования байт не соответствует порядку следования байтов на процессорах Intel, то есть старший байт находится по младшему адресу). Приведем ее.


Вычитание с учетом знака чисел размером N байт (макрокоманда)

sub_sign_N macro minuend.deduction.N
local cycl.ml

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

;sub_sign_N minuend.deduction.N - макрокоманда вычитания

;c учетом знака чисел размером N байт

:Вход: minuend и deduction - уменьшаемое и вычитаемое. N - длина в байтах.

:Порядок следования байт - старший байт по младшему адресу (не Intel).

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

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

push si

mov cl,N

mov si.N-1 cycl: moval .deduction[si]

sbbminuend[si],al : jnc ml

: neg minuend[si] ml: dec si

loop cycl

pop si

endm


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