Двоичные числа. Сложение двоичных чисел.
Прежде чем программировать, запишите программу в псевдокодах.
Д. Ван Тассел
Сложение чисел размером 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, то есть старший байт находится по младшему адресу). Приведем ее.