Написать программу сложения двух десятиразрядных неупакованных десятичных чисел.
Текст программы:
model SMALL
stack 100h
dataseg
Ask1 db 0Ah,0Dh,'Введите первое слагаемое (не более 10 цифр):$'
Ask2 db 0Ah,0Dh,'Введите второе слагаемое (не более 10 цифр):$'
Buf1 db 11
Len1 db?
Opnd1 db 12 dup(?)
Buf2 db 11
Len2 db?
Opnd2 db 12 dup(?)
ResT db 0Ah,0Dh,'Сумма '
Res db 12 dup(' '),'$'
AskCont db 0Ah,0Dh
db 'Завершить работу - Esc, продолжить - ЛЮБАЯ ÊËÀÂÈØÀ'
db '$'
codeseg
startupcode
push DS
pop ES; ES <- DS
BEGIN:
;Ввод первого слагаемого
B1: lea DX, Ask1
mov AH, 09h
int 21h
lea DX, Buf1
mov AH, 0Ah
int 21h
cmp Len1, 0
je B1
;проверка 0-9 и очистка старш.тетрады
lea BX, Opnd1
xor CX, CX
mov CL, Len1
xor SI, SI
T1: mov AL, [BX][SI]
cmp AL, '0'
jb B1; ошибка
cmp AL, '9'
ja B1; ошибка
and AL, 0Fh
mov [BX][SI], AL
inc SI
loop T1
;прижать к правому краю
mov CL, Len1
cmp CL, 10
je E1
mov DI, 9
mov SI, CX
dec SI
P1: mov AL, [BX][SI]
mov [BX][DI], AL
dec DI
dec SI
loop P1
;обнулить лишнее
xor DI, DI
mov CL, 10
sub CL, Len1
N1: mov byte ptr [BX][DI], 0
inc DI
loop N1
E1:
;Ввод второго слагаемого
B2: lea DX, Ask2
mov AH, 09h
int 21h
lea DX, Buf2
mov AH, 0Ah
int 21h
cmp Len2, 0
je B2
;проверка 0-9 и очистка старш.тетрады
lea BX, Opnd2
xor CX, CX
mov CL, Len2
|
|
xor SI, SI
T2: mov AL, [BX][SI]
cmp AL, '0'
jb B2; ошибка
cmp AL, '9'
ja B2; ошибка
and AL, 0Fh
mov [BX][SI], AL
inc SI
loop T2
;прижать к правому краю
mov CL, Len2
cmp CL, 10
je E2
mov DI, 9
mov SI, CX
dec SI
P2: mov AL, [BX][SI]
mov [BX][DI], AL
dec DI
dec SI
loop P2
;обнулить лишнее
xor DI, DI
mov CL, 10
sub CL, Len2
N2: mov byte ptr [BX][DI], 0
inc DI
loop N2
E2:
;Сложение
mov CX, 10
clc
lea SI, Opnd1+9
lea DI, Opnd2+9
lea BX, Res+10
A1: mov AL, [SI]
adc AL, [DI]
aaa
mov [BX], AL
dec SI
dec DI
dec BX
loop A1
mov AL, 0
adc AL, 0
mov [BX], AL
;Преобразование результата в ASCII
mov CX, 11
A2: or byte ptr [BX], 30h
inc BX
loop A2
;Вывод результата
lea DX, ResT
mov AH, 09h
int 21h
;Запрос на продолжение работы
lea DX, AskCont
mov AH, 09h
int 21h
mov AH, 08h
int 21h
cmp AL, 27;ESC
je QUIT
jmp BEGIN
;Конец работы
QUIT: exitcode 0
end
ВАРИАНТЫ ЗАДАНИЙ
1. Имеются две группы заданий стандартной (варианты 1–5) и повышенной сложности (варианты 6–8), выберите самостоятельно любой вариант из какой–либо группы.
2. Введите два десятичных числа разрядностью не более 10 цифр, выполните преобразование в упакованный BCD-формат, сложите их и выведите результат.
3. Введите два десятичных числа разрядностью не более 10 цифр, выполните преобразование в упакованный BCD-формат, вычтете второе из первого и выведите результат.
4. Введите два десятичных числа, первое разрядностью не более 10 цифр, второе – из одной цифры выполните преобразование в неупакованный BCD-формат, перемножьте их и выведите результат.
5. Введите два десятичных числа разрядностью не более 10 цифр, выполните преобразование в неупакованный BCD-формат, вычтете второе из первого и выведите результат.
6. Введите два десятичных числа, первое разрядностью не более 10 цифр, второе – из одной цифры выполните преобразование в неупакованный BCD-формат, поделите первое на второе и выведите результат.
|
|
7. Напишите программу – калькулятор выполняющую действия + –, внутреннее представление чисел – упакованный BCD-формат.
8. Напишите программу – калькулятор выполняющую действия + – *, внутреннее представление чисел – неупакованный BCD-формат.
9. Напишите программу – калькулятор выполняющую действия + – /, внутреннее представление чисел – неупакованный BCD-формат.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Чем отличаются упакованный и неупакованный BCD-форматы представления десятичных чисел?
2. Что такое десятичная коррекция результата арифметической операции?
3. Почему используются различные команды десятичной коррекции для различных арифметических операций?
4. Как организовать выполнение операций сложения и вычитания над многоразрядными операндами?
5. Зачем нужны команды десятичной арифметики?
6. Почему коррекция для деления выполняется перед операцией, а для остальных операций – после?
Лабораторная работа |
ÏÎÄÏÐÎÃÐÀÌÌÛ |