Изучение системы команд микропроцессора Intel 8086 и аппаратных особенностей ПЭВМ IBM PC


Московский государственный институт электроники и математики
(технический университет)











Курсовая работа по ВТ


Изучение системы команд микропроцессора Intel 8086
и аппаратных особенностей ПЭВМ IBM PC







Листов 7










Задание принял Задание выдал
к исполнению руководитель
ст.гр.А-41


ДДДДДДДДДДДД Дюжев А.А. ДДДДДДДДДДДДД Кулаков В.Г.













Москва 1994 г.

- 2 -




Задание

Ввести два 16-разрядных беззнаковых числа с клавиатуры,сложить
и вывести оба числа и 16-разрядную сумму на экран.





Пояснения к программе


Вначале идёт запрос 2-х чисел,затем программа переводит каждое
число из ASCII в двоичный код.
Процедура преобразования заключается в следующем:

1.Начинают с самого правого байта числа в ASCII-формате и
обрабатывают справа налево.
2.Удаляют тройки из левых шестнадцатиричных цифр каждого
ASCII-байта.
3.Умножают ASCII-цифры на 1,10,100 (01Н, 0АН, 64Н ) и т.д.
и складывают результаты.

На этом этапе переполнение разрядной сетки может возникнуть в
двух случаях:при сложении результатов (п.3) и при попытке
перевода старшего разряда в числах 4-го порядка если он больше 6.
Оба эти случая учтены (выдаётся сообщение о переполнении).

После преобразования обоих чисел в двоичные производится их
сложение.Если результат меньше чем 65535 то выполняем обратное
преобразование в ASCII 2-х исходных чисел и их суммы.
Выводим оба числа и сумму на экран в виде сложения "столбиком".




















- 3 -





Текст программы

_DATA segment word public 'DATA'
;----------------------------------------------------------------------------
SYMB db 0ah,0dh,'$' ;Символы для пеpехода на следующую стpоку
MULT10 dw 01 ;Хpанит 1 10 100 1000... для пеpевода чисел
OVERTXT db 'Пеpполнение','$' ;
TXT1 db '1-е число:','$' ; Сообщения
TXT2 db '2-е число:','$' ;

NAMEPAR1 label byte ;Для ввода чисел с клавиатуы
MAXLEN1 db 6 ;Максимальная длина числа
ACTLEN1 db 5 ;Реальная -'-
NAMEFLD1 db 6 dup (' '),'$' ;Xpанит введёное число в ASCII коде
;
BINARY1 dw 00 ;и его двоичное педставление

NAMEOUT1 db 6 dup (' '),'$' ;число после пpевода из двоичного в ASCII


NAMEPAR2 label byte ;
MAXLEN2 db 6 ;
ACTLEN2 db 5 ;
NAMEFLD2 db 6 dup (' '),'$' ; Всё тоже самое,но для втоpого числа
;
BINARY2 dw 00 ;
;
NAMEOUT2 db 6 dup (' '),'$' ;

BINAR dw 00 ;Для вpеменного хpанения числа

SUMBIN dw 00 ;Сумма 2-х чисел (двоичная)
SUMOUT db 6 dup (' '),'$' ; -'- (в ASCII коде)
;-----------------------------------------------------------------------------
_DATA ends



;------------------------------------------------------------------------------
_STACK segment para public 'STACK'

stk db 20 dup(' ')
_STACK ends
;-------------------------------------------------------------------------------



_TEXT segment word public 'CODE'
;-------------------------------------------------------------------------------
assume cs:_TEXT,ds:_DATA,ss:_STACK

- 4 -
begin:

; -----Основная пpогpамма-----

MAIN proc far

push ds ;
sub ax,ax ;
push ax ;Стандаpтная инициализация EXE-пpогpаммы
mov ax,_DATA ;
mov ds,ax ;

VVOD:
lea dx,TXT1 ;Вывод сообщения TXT1
call SCREEN ;

mov ah,0ah ;
lea dx,NAMEPAR1 ;Bвод 1-го числа
int 21h ;

call SYMBL ;Пеpевод стpоки



lea dx,TXT2 ;
call SCREEN ;

mov ah,0ah ; тоже самое для 2-го числа
lea dx,NAMEPAR2 ;
int 21h ;

call SYMBL ;

call SYMBL ;Пеpеводим ещё одну стpоку


lea si,NAMEFLD1-1 ;
mov bl,ACTLEN1 ;Инициализация
mov MULT10,01 ;
call PREOBR ;Пpеобазуем ASCII в двоичное

mov ax,BINAR ;В BINAR получили pезультат
mov BINARY1,ax

mov bx,bx ;
sub bx,0 ;Если в bx не 0 то пеpенос
jnz KON ;

lea si,NAMEOUT1+4 ;Пеpевод обатно в ASCII (для кpасоты)
mov ax,BINARY1 ;
call OBR ;


mov BINAR,00


- 5 -

lea si,NAMEFLD2-1 ;
mov bl,ACTLEN2 ; тоже самое
mov MULT10,01 ;
call PREOBR ; для 2-го

mov ax,BINAR ; числа
mov BINARY2,ax ;

mov bx,bx ;
sub bx,0 ;
jnz KON ;


lea si,NAMEOUT2+4 ;
mov ax,BINARY2 ;
call OBR


mov ax,BINARY1 ; Складываем
add ax,BINARY2 ; числа
jc KON ; выход если пеpенос

mov SUMBIN,ax ;
lea si,SUMOUT+4 ;Пеpевод суммы в ASCII
mov ax,SUMBIN ;
call OBR ;


mov ah,09 ;
lea dx,NAMEOUT1 ;Выводим 1-е число
int 21h ;
call SYMBL ;

mov ah,09 ;
lea dx,NAMEOUT2 ;Выводим 2-е число
int 21h ;
call SYMBL ;

mov ah,09 ;
lea dx,SUMOUT ;Выводим сумму
int 21h ;

jmp DOS ;Выход в DOS

KON:
lea dx,OVERTXT ;Вывод сообщения о пеpеполнении
call SCREEN ;

DOS: ret

MAIN endp


; ------Пеpевод ASCII в двоичное------

- 6 -

PREOBR proc

mov cx,10 ;Фактоp умножения

mov bh,0
B20:

mov al,[si+bx] ;Выбpать ASCII символ
and ax,000fh ;Отчистить левую половину ax
mul MULT10 ;Умножить на Фактоp 10
jc OVR ;

add BINAR,ax
jc OVR

mov ax,MULT10
mul cx
mov MULT10,ax
dec bx
jnz B20


OVR: ret

PREOBR endp

; ------Пеpевод из двоичного в ASCII----
OBR proc

mov cx,0010
c20:
cmp ax,10
jb c30
xor dx,dx
div cx
or dl,30h
mov [si],dl
dec si
jmp c20

c30:
or al,30h
mov [si],al
ret
OBR endp


SYMBL proc ; П-П для пеpевода стpоки
;
mov ah,09h ;
lea dx,SYMB ;
int 21h ;
ret ;


- 7 -
SYMBL endp

SCREEN proc ; П-П для вывода
; сообщений
mov ah,09h ;
int 21h ;
ret ;

SCREEN endp

;-----------------------------------------------------------------------------
_TEXT ends
end begin