Изучение арифметических команд языка Ассемблер IBM PC.

 

Постановка задачи

Разработать программу для выполнения сложения над неотрицательными 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, б) проверялась единица переноса, в) вычитание двух положительных чисел с учётом переноса между байтами. Данные тесты являются исчерпывающими для данной постановки задачи (проверяют все возможные граничные условия).

Предлагаю ознакомиться с аналогичными статьями: