Постановка задачи
Разработать программу для выполнения сложения над неотрицательными 80-ти разрядными двоичными операндами. Исходные данные представить в распакованном формате в 4-ричной системе счисления. Таким образом, при выполнении задания следут запрограммировать последовательность действий:
1) преобразование исходных данных;
2) выполнение арифметической операции;
Под распакованным форматом в заданной системе счисления следует понимать представление числа в виде последовательности ASCII-кодов арабских цифр, используемых этой системой счисления.
Исходные данные определить с помощью директив определения данных.
Кроме того, в качестве информации о корректности выполнения арифметической операции сложения или вычитания сформировать однобайтовый код ошибки, равный 0, если результат операции представляет собой 80-битовое неотрицательное число, и равный FFH в противном случае.
Выполнить тестирование программы, по крайней мере, для трех типов тестов, соответствующих ситуациям:
1) операнды и результат выполнения операции представляют собой положительные 80-разрядные двоичные числа;
2) один из операндов равен 0;
3) длина результата выполнения операции сложения превышает 80 бит или результат выполнения операции вычитания – отрицательное число.
Описание алгоритма
Преобразование исходных данных
Т.к. для представления одной цифры 4-ричной системы в двоичной системе используются две цифры, то для преобразования чисел я использую следующий алгоритм:
1) Загружаем очередной байт исходного числа в регистр AL.
2) Вычисляем в нём цифру 4-ричного числа.
3) Сдвигаем регистр AL на 6 знаков.
4) Сдвигаем регистр AX на 2 знака.
5) Повторяем пункты 1-4 ещё три раза.
6) Значение регистра AH записывается в число результат
7) Действия повторяются до тех пор пока все байты исходного числа не будут обработаны.
Сложение чисел
Для сложения чисел организуется цикл, в котором все цифры исходных чисел рассматриваются справа налево, и производится их сложение с учётом переноса.
Тестирование программы
1) Исходные данные:
A= '1203011123120301112312030111231203011123'
B= '2103121031210312103121031210312103121031'
Результат:
RES=F6798F6718F6798F67A8
ERROR=0
2) Исходные данные:
A= '1203011123120301112312030111231203011123'
B= 40 DUP(0)
Результат:
RES=6315B6315B6315B6315B
ERROR=0
2) Исходные данные:
A= '1203011123120301112312030111231203011123'
B= '3210332103321033210332103321033210332103'
Результат:
RES=470EF480EE470EF480EE
ERROR=FF
Текст программы
LAB5 SEGMENT
ASSUME CS:LAB5,DS:LAB5,SS:LAB5
ORG 100H
BEGIN: JMP MAIN
;//-----------------------------------
A DB '1203011123120301112312030111231203011123'
B DB '3210332103321033210332103321033210332103'
A_TR DB 10 DUP(0)
B_TR DB 10 DUP(0)
RES DB 10 DUP(0)
TR DB 0
ERROR DB 0
;//-----------------------------------
MAIN: XOR AX,AX
LEA SI,A
LEA DI,A_TR
MOV CL,10
CONV: MOV DL,CL
MOV CL,4
ONE_B: MOV DH,CL
MOV CL,6
MOV AL,[SI]
AND AL,3H
SHL AL,CL
SHL AX,1
SHL AX,1
INC SI
MOV CL,DH
LOOP ONE_B
MOV [DI],AH
INC DI
MOV CL,DL
LOOP CONV
XOR AX,AX
LEA SI,B
LEA DI,B_TR
MOV CL,10
CMP TR,0
MOV TR,1
JZ CONV
;//-----------------------------------
CLC
LEA SI,A_TR+9
LEA DI,B_TR+9
LEA BX,RES+9
MOV CL,10
ADDING: XOR AH,AH
MOV AL,[SI]
ADC AL,[DI]
MOV [BX],AL
DEC SI
DEC DI
DEC BX
LOOP ADDING
JNC EXIT
MOV ERROR,0FFH
EXIT: RET
LAB5 ENDS
END BEGIN
Вывод
В ходе проведенной лабораторной работы были изучены арифметические команд языка Ассемблер IBM PC. Была составлена программы производящая сложение двух 80-ти разрядных двоичных числа. По окончанию сложения формировался код ошибки (единица переноса). Программа была проверена на тестах, проверяющих условия: а) один из операндов = 0, б) проверялась единица переноса, в) вычитание двух положительных чисел с учётом переноса между байтами. Данные тесты являются исчерпывающими для данной постановки задачи (проверяют все возможные граничные условия).
0 коммент.:
Отправить комментарий