Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет ассемблер 1.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
92.67 Кб
Скачать

Санкт-Петербургский Государственный Политехнический

Университет

ФАКУЛЬТЕТ ТЕХНИЧЕСКОЙ КИБЕРНЕТИКИ

КАФЕДРА СИСТЕМ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ

Отчет

По лабораторной работе №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