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

     

Вычисление дополнения числа размером N байт



Вычисление дополнения числа размером N байт

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

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

;Вход: bx - адрес операнда в памяти; сх - длина операнда.

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

Выход: bx - адрес результата в памяти

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

.code calc_complement proc

хог si,si

neg byte ptr [bx] дополнение первого байта

cmp byte ptr [bx],0 ;нулевой операнд - особый случай

jne short $+3

stc установить cf, так как есть перенос



dec ex

jcxz @@ml ;для однобайтного операнда

@@cycl: iпс si

not byte ptr [bx][si]

adc byte ptr [bx][si],0

loop @@cycl

@@ml: ret calc_complement endp

Для значений размерностью 1/2/4 байта дополнение можно получать с помощью одной команды NEG:

neg operand

Для значений N байт необходимо реализовывать алгоритм. Дополнение первого байта необходимо вычислять с учетом того, что он может быть нулевым. Попытка получить его дополнение с помощью команды NEG обречена на провал. Флаг CF в этом случае также должен устанавливаться программно. Подумайте, почему?



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

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

:(старший байт по младшему адресу).

;Вход: регистр ВХ - адрес операнда в памяти: регистр СХ - длина операнда. ;Выход: регистр ВХ - адрес дополнения операнда в памяти.

ca1c_complement_r ргос

dec ex

mov si.ex

neg byte ptr [bx][si] дополнение первого байта

cmp byte ptr [bx][si].O :operand=0 - особый случай

jne short $+3

stc установить cf, так как есть перенос

jcxz @@exit_cycl :для однозначного числа

@@cycl:dec si

not byte ptr [bx][si]

adc byte ptr [bx][si],0

loop @@cycl @@exit_cycl: ret calc_complement_r endp

Для значений размерностью 1/2/4 байта дополнение можно получать с помощью одной команды NEG:

neg operand

Дополнение значений N байт вычисляет алгоритм, реализованный в процедуре calc_complement_r. Обратите внимание, что первый байт может быть нулевым, поэтому алгоритм учитывает это обстоятельство. Попытка получить его дополнение с помощью команды NE6 обречена на провал. Флаг CF в этом случае также должен устанавливаться программно. Подумайте, почему?



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