
Санкт-Петербургский Государственный Политехнический
Университет
ФАКУЛЬТЕТ ТЕХНИЧЕСКОЙ КИБЕРНЕТИКИ
КАФЕДРА СИСТЕМ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ
Отчет
По лабораторной работе №1
«Сложение целых чисел со знаком»
Работу выполнила студентка группы 3083/2:
Бородина Ксения
Санкт-Петербург
2012
1.Задание
Просуммировать два двухбайтных числа с учетом знака. Одно из чисел находится по адресу 2000H-2001H, второе – 2008H-2009H. Результат записывается по адресу 2018H-2019H. Ограничение на сложение двух положительных чисел – 7FFFH. Ограничение на сложение двух отрицательных чисел – FFFFH.
2.Алгоритм
Описание алгоритма:
На первом этапе определяем знак числа. Если оно отрицательно ,то в отдельную ячейку записываем единицу(на место первого бита если первое число отрицательное-01B,и на место второго бита если отрицательно второе-10B), переводим число в дополнительный код, для этого заносим старший байт числа в аккумулятор и выполняем сдвиг через бит переноса, если после данной операции бит переноса равен 1 ,то число отрицательное, мы обращаемся к подпрограмме перевода в доп.код, после чего число записывается по старому адресу и мы возвращаемся в главную программу, также проверяем второе число.
На втором этапе складываем два числа по-байтно.
На третьем этапе обрабатываем результат. Рассматриваются 4 варианта:
Два числа положительных, два отрицательных, отрицательно только первое, отрицательное только второе. Если два числа отрицательны, то проверяем бит переноса,если он равен 1,то результату присваеваем максимальное отрицательно число-FFFFH,иначе переводим число в прямой код.Если два числа положительны,то проверяем бит переноса,если он равен 1 ,то присваиваем максимальное положительное число-7FFFH, иначе полученный результат является ответом.Если числа разных знаков ,то проверяем какое из чисел было больше,если отрицательное то переводим число в прямой год,если положительно,то результат является ответом.
3.Карта памяти.
4.Код программы
ORG 2000H ;Занесение первого числа по адресу 2000Н
DB 00H,ffH
ORG 2008H ;Занесение второго числа по адресу 2008Н
DB ffH,ffH
ORG 1000H ;Начало программы
MVI E,2 ;Заносим в регистор Е число 2(длинна числа)
MVI A,0 ;Заносим в аккамулятор 0
STA 2011H ;Заносим сод-е акк-ра в ячейку 2011Н
MOV A,E ;Заносим в акк-р значение регистра E
STA 2010H ; Заносим сод-е акк-ра в ячейку 2011Н
;proverka pervogo
LDA 2001H ;Заносим старший байт первого числа в акк-р
RAL ;Сдвигаем сод-е акк-ра через бит переноса,чтобы ! определить знак
JNC MODIN ;если С=0,то переходим к метке MODIN
MVI A,01B ;Заносим в акк-р 01В
STA 2011H ;Заносим сод-е акк-ра в ячейку 2011Н,это означает что 1 первое число отрицательное,т.е первый бит числа равен единице
lxi de,2000h ;Помещаем первое число в регистровую пару DE
xchg ;Обмен данными между регистровыми парами DE и HL
call invert ;Вызываем функцию которая переводит число в доп.код
MODIN:
;proverka vtorogo
MVI A,0 ;Обнуляем аккамулятор
LDA 2009H ;Заносим старший байт второго числа в акк-р
RAL ;Сдвигаем сод-е акк-ра через бит переноса,чтобы ! определить знак числа
JNC MDVA ;если С=0,то переходим к метке MDVA
LDA 2011H ;Заносим сод-е ячейки 2011Н в акк-р
ORI 10B ;Выполняем лог-ое сложение сод-го акк-ра и числа ! ! 10В,после чего во втором бите числа будет 1
STA 2011H ; Заносим сод-е акк-ра в ячейку 2011Н,это означает 1 что второе число отриц-е,т.е второй бит числа равен единице
lxi de,2008h ;Помещаем второе число в регистровую пару DE
xchg ;Обмен данными между регистровыми парами DE и HL
call invert ;Вызываем функцию которая переводит число в доп.код
MDVA:
;slojenie
LXI BC,2000H ;Заносим первое число в рег-ю пару BC
LXI HL,2008H ;Заносим первое число в рег-ю пару HL
LDAX BC ;в ак-р загружаем BC
ADC M ;Складываем с учетом знака младшие байты чисел
STA 2018H ;Заносим сод-е акк-ра в ячейку 2018Н
INX BC ;Увеличиваем значение регистровой пары на 1
INX HL ;Увеличиваем значение регистровой пары на 1
LDAX BC ;в ак-р загружаем BC
ADC M ;Складываем с учетом знака младшие байты чисел
STA 2019H ;Заносим сод-е акк-ра в ячейку 2019Н
;obrabotka rezultata
LDA 2011H ;Заносим сод-е ячейки 2011Н в ак-р
MVI D,11B ;Заносим в рег-р D число 11В
XRA D ;Выполняем поразрядное исключающее или на содержимым 1 акк-ра и регистра
;esle dva chisla otr.
JNZ DVAOTR ;если в акк-ре не 0,то переходим к метке DVAOTR
LDA 2019H ;Заносим в акк-р значение ячейки 2019Н
RAL ;Сдвигаем сод-е акк-ра через бит переноса
JC MM ;если 1 ,то перейти по метке MM
LDA 2019H ;Заносим в акк-р значение ячейки 2019Н
RAL ;Сдвигаем сод-е акк-ра через бит переноса
JC MMM ;если 1 ,то перейти по метке MMM
MVI A,11111111B ;Помещаем в ак-р число 11111111B
STA 2018H ;Заносим содержимое акк-ра в ячейку 2018Н
STA 2019H ;Заносим содержимое акк-ра в ячейку 2018Н
MMM:
JMP 3000H ;NA VIHOD ;Прыгаем на конец программы
MM:
lxi de,2018h ;Заносим сод-е ячейки 2018Н в регистровую пару DE
xchg ;Обмен данными между регистровыми парами DE и HL
call invert ;Вызываем функцию которая переводит число в прям.код
jmp 3000h ;Прыгаем на конец программы
DVAOTR:
LDA 2011H ;Заносим сод-е ячейки 2011Н в ак-р
MVI D,00H ;Заносим в рег-р D число 11В
XRA D ;Выполняем поразрядное исключающее или на содержимым 1 акк-ра и регистра
;esle dva chisla pol.
JNZ DVAPOL ;если в акк-ре не 0,то переходим к метке DVAPOL
LDA 2019H ;Заносим в акк-р значение ячейки 2019Н
RAL ;Сдвигаем сод-е акк-ра через бит переноса
JNC MM1 ;если 0 ,то перейти по метке MM1
MVI A,11111111B ;Помещаем в ак-р число 11111111B
STA 2018H ;Заносим сод-е акк-ра в ячейку 2018Н
MVI A,01111111B ;Помещаем в ак-р число 01111111B
STA 2019H ;Заносим сод-е акк-ра в ячейку 2019Н
MM1:
JMP 3000H; ;Прыгаем на конец программы
DVAPOL:
LDA 2019H ;Заносим сод-е ячейки 2011Н в ак-р
RAL ;Сдвигаем сод-е акк-ра через бит переноса
;esle pol < otr.
JC MMMM ;если 1 ,то перейти по метке MMMM
JMP 3000H ;Прыгаем на конец программы
MMMM:
lxi de,2018h ;Заносим результат в рег.пару DE
xchg ;Обмен данными между регистровыми парами DE и HL
call invert ;Вызываем функцию которая переводит число в прям.код
jmp 3000h ;Прыгаем на конец программы
org 2500h ;Подпрограмма перевода числа в доп.код
invert:
mvi c,01b ;Заносим в регистр С число 01В
push hl ;Занесение в стек содержимого регистровой пары HL
mov a,m ;Пересылка данных из памяти в акк-р
cma ;Поразрядное инвертирование содержимого акк-ра
add c ;Складываем значения акк-ра и регистра С
jc nn ;если бит переноса равен 1,то переходим к метке nn
mvi c,00b ;Заносим в регистр С число 00В
nn:
mov m,a ;Пересылка данных из акк-ра в память
inx hl ;Увеличиваем значение рег.пары на 1
mov a,m ;Пересылка данных из памяти в акк-р
cma ;Поразрядное инвертирование содержимого акк-ра
ori 80h ;Логическое сложение сод-го акк-ра и число 80Н
add c ;Складываем сод-е акк-ра и регистра С
mov m,a ;Пересылка данных из акк-ра в память
pop hl ;Загрузка пары регистров из стека
ret ;Возвращение в главную программу
org 3000h
hlt