Изучение системы команд микропроцессора 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