Иллюстрированный самоучитель по задачам и примерам Assembler

Двоичные числа. Сложение двоичных чисел.

Прежде чем программировать, запишите программу в псевдокодах.

Д. Ван Тассел

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

---------------------------------------------------------------------
:add_unsign – процедура сложения чисел размером 1 байт без учета_1 знака
;Вход: sumnand_1 и summand_2 – слагаемые.
:Выход: sum_b или sum_w – значение суммы с учетом переполнения.
---------------------------------------------------------------------
.data
summand_1db? значения в summand_1 и summand_2
summandj? db?:нужно внести
sum_w label word
sum_b db 0
carry db 0
.code
add_unsign proc
mov al,summand_2
add al,summand_1mov sumji.al
jnc end_p:проверка на переполнение
adc carry,0
end_p: ret
add_unsign endp

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

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

:add_unsign_N – процедура сложения чисел размером N байт без учета знака
:Вход: summand_1 и summand_2 – слагаемые. N – длина в байтах.
:Выход: summand_1или carry+summandj. – значение суммы с учетом переполнения.
.data
summand_1db?;первое слагаемое
N=$-surranand_1;длина в байтах значений summand_1 и summand_2
carry db 0:перенос сложения последних байтов
summand_2 db?:второе слагаемое
.code
add_unsign_N proc
mov cl. N
хог si.si cycl: mov al,summand_2[si]
adc summand_l[si].al
inc si
loop cycl
jnc end_p;проверка на переполнение
adc carry. 0
end_p: ret
add_unsign_N endp

Программа учитывает возможное переполнение результата. Сегмент данных может быть задан, например, так:

.data
summand_1db 0.34.56.78.250; первое слагаемое
N=$-summand_1:длина в байтах значений summand_1 и summand_2
carry db 0;перенос сложения последних байт
summand_2 db 0.43.65.230.250: второе слагаемое

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.