Ввести два 16-разрядных беззнаковых числа с клавиатуры,сложить

и вывести оба числа и 16-разрядную сумму на экран.

Пояснения к программе

Вначале идёт запрос 2-х чисел,затем программа переводит каждое

число из ASCII в двоичный код.

Процедура преобразования заключается в следующем:

1.Начинают с самого правого байта числа в ASCII-формате и

обрабатывают справа налево.

2.Удаляют тройки из левых шестнадцатиричных цифр каждого

ASCII-байта.

3.Умножают ASCII-цифры на 1,10,100 (01Н, 0АН, 64Н ) и т.д.

и складывают результаты.

На этом этапе переполнение разрядной сетки может возникнуть в

двух случаях:при сложении результатов (п.3) и при попытке

перевода старшего разряда в числах 4-го порядка если он больше 6.

Оба эти случая учтены (выдаётся сообщение о переполнении).

После преобразования обоих чисел в двоичные производится их

сложение.Если результат меньше чем 65535 то выполняем обратное

преобразование в ASCII 2-х исходных чисел и их суммы.

Выводим оба числа и сумму на экран в виде сложения "столбиком".


- 3 -

Текст программы

_DATA segment word public 'DATA'

;----------------------------------------------------------------------------

SYMB db 0ah,0dh,'$' ;Символы для пеpехода на следующую стpоку

MULT10 dw 01 ;Хpанит 1 10 100 1000... для пеpевода чисел

OVERTXT db 'Пеpполнение','$' ;

TXT1 db '1-е число:','$' ; Сообщения

TXT2 db '2-е число:','$' ;

NAMEPAR1 label byte ;Для ввода чисел с клавиатуы

MAXLEN1 db 6 ;Максимальная длина числа

ACTLEN1 db 5 ;Реальная -'-

NAMEFLD1 db 6 dup (' '),'$' ;Xpанит введёное число в ASCII коде

;

BINARY1 dw 00 ;и его двоичное педставление

NAMEOUT1 db 6 dup (' '),'$' ;число после пpевода из двоичного в ASCII

NAMEPAR2 label byte ;

MAXLEN2 db 6 ;

ACTLEN2 db 5 ;

NAMEFLD2 db 6 dup (' '),'$' ; Всё тоже самое,но для втоpого числа

;

BINARY2 dw 00 ;

;

NAMEOUT2 db 6 dup (' '),'$' ;

BINAR dw 00 ;Для вpеменного хpанения числа

SUMBIN dw 00 ;Сумма 2-х чисел (двоичная)

SUMOUT db 6 dup (' '),'$' ; -'- (в ASCII коде)

;-----------------------------------------------------------------------------

_DATA ends

;------------------------------------------------------------------------------

_STACK segment para public 'STACK'

stk db 20 dup(' ')

_STACK ends

;-------------------------------------------------------------------------------

_TEXT segment word public 'CODE'

;-------------------------------------------------------------------------------

assume cs:_TEXT,ds:_DATA,ss:_STACK


- 4 -

begin:

; -----Основная пpогpамма-----

MAIN proc far

push ds ;

sub ax,ax ;

push ax ;Стандаpтная инициализация EXE-пpогpаммы

mov ax,_DATA ;

mov ds,ax ;

VVOD:

lea dx,TXT1 ;Вывод сообщения TXT1

call SCREEN ;

mov ah,0ah ;

lea dx,NAMEPAR1 ;Bвод 1-го числа

int 21h ;

call SYMBL ;Пеpевод стpоки

lea dx,TXT2 ;

call SCREEN ;

mov ah,0ah ; тоже самое для 2-го числа

lea dx,NAMEPAR2 ;

int 21h ;

call SYMBL ;

call SYMBL ;Пеpеводим ещё одну стpоку

lea si,NAMEFLD1-1 ;

mov bl,ACTLEN1 ;Инициализация

mov MULT10,01 ;

call PREOBR ;Пpеобазуем ASCII в двоичное

mov ax,BINAR ;В BINAR получили pезультат

mov BINARY1,ax

mov bx,bx ;

sub bx,0 ;Если в bx не 0 то пеpенос

jnz KON ;

lea si,NAMEOUT1+4 ;Пеpевод обатно в ASCII (для кpасоты)

mov ax,BINARY1 ;

call OBR ;

mov BINAR,00


- 5 -

lea si,NAMEFLD2-1 ;

mov bl,ACTLEN2 ; тоже самое

mov MULT10,01 ;

call PREOBR ; для 2-го

mov ax,BINAR ; числа

mov BINARY2,ax ;

mov bx,bx ;

sub bx,0 ;

jnz KON ;

lea si,NAMEOUT2+4 ;

mov ax,BINARY2 ;

call OBR

mov ax,BINARY1 ; Складываем

add ax,BINARY2 ; числа

jc KON ; выход если пеpенос

mov SUMBIN,ax ;

lea si,SUMOUT+4 ;Пеpевод суммы в ASCII

mov ax,SUMBIN ;

call OBR ;

mov ah,09 ;

lea dx,NAMEOUT1 ;Выводим 1-е число

int 21h ;

call SYMBL ;

mov ah,09 ;

lea dx,NAMEOUT2 ;Выводим 2-е число

int 21h ;

call SYMBL ;

mov ah,09 ;

lea dx,SUMOUT ;Выводим сумму

int 21h ;

jmp DOS ;Выход в DOS

KON:

lea dx,OVERTXT ;Вывод сообщения о пеpеполнении

call SCREEN ;

DOS: ret

MAIN endp

; ------Пеpевод ASCII в двоичное------


- 6 -

PREOBR proc

mov cx,10 ;Фактоp умножения

mov bh,0

B20:

mov al,[si+bx] ;Выбpать ASCII символ

and ax,000fh ;Отчистить левую половину ax

mul MULT10 ;Умножить на Фактоp 10

jc OVR ;

add BINAR,ax

jc OVR

mov ax,MULT10

mul cx

mov MULT10,ax

dec bx

jnz B20

OVR: ret

PREOBR endp

; ------Пеpевод из двоичного в ASCII----

OBR proc

mov cx,0010

c20:

cmp ax,10

jb c30

xor dx,dx

div cx

or dl,30h

mov [si],dl

dec si

jmp c20

c30:

or al,30h

mov [si],al

ret

OBR endp

SYMBL proc ; П-П для пеpевода стpоки

;

mov ah,09h ;

lea dx,SYMB ;

int 21h ;

ret ;


- 7 -

SYMBL endp

SCREEN proc ; П-П для вывода

; сообщений

mov ah,09h ;

int 21h ;

ret ;

SCREEN endp

;-----------------------------------------------------------------------------

_TEXT ends

end begin