Модель арифметико-логічного пристрою

Автор: Пользователь скрыл имя, 29 Декабря 2010 в 01:44, курсовая работа

Описание работы

Мета роботи: навчитися складати програму на мові асемблеру, яка використовує арифметичні та логічні операції.

Завдання:

Скласти програму моделювання операції додавання, віднімання і множення чисел з фіксованою крапкою з заданою кількістю розрядів.

Введення операндів виконувати з клавіатури.

Результати виводити на екран.

Содержание

Вступ 3
1.ЗАГАЛЬНІ ВІДОМОСТІ 4
1.1.Формати числових даних 4
1.2. Виконання арифметичних операцій 5
2. Блок-схема програми 9
2.1.Головна програма 9
2.2. Блок-схеми підпрограм 10
3. Опис роботи програми 14
3.1. Опис роботи головної програм 14

3.2. Опис виконання арифметичних операцій 14

4. Лістинг програми 16

5. Результати виконання програми 26

Висновки 28

Використані джерела 29

Работа содержит 1 файл

Курсова робота варіант_8_неупак.doc

— 353.00 Кб (Скачать)

          je       my11              ;если 0, то ищем дальше

          jmp      next10            ;если не 0, то выводим число

my11:

          inc      di                ;ищем индекс первой выводимой цифры

          cmp     di,lt             ;если кол-во обработанных знаков

          je       go                ;равно кол-ву их в целой  части 

          loop     my12

go:       mov      al,'0'            ;выводим 0

          Out_Sym

go1:      mov      al,'.'            ;выводим .

          Out_Sym

next10:

          mov      al,man[di]        ;собственно вывод

          Out_Sym                    ;целой части числа

          inc      di

          cmp      di,lt

          je       go1

          loop     next10

finOpOut: 

ENDM      Op_Out   

;ввод числа

Op_In     MACRO zn,man

local @113,@114,vvod1,vvodM,chb,nach,next1,next2,next3,next4,tochka,met1,met2,met3,met4,met5,met6,allfinal,left,finOpIn,povtor

vvod1:

         Set_Kur  01,00

          Scr_out  about2

          Set_Kur  10,00

          cmp      lop,1

          jne    chb  

          scr_out  mes3

          jmp      nach

chb:

          scr_out  mes4

nach:     mov      zn,2Bh            ;zn = '+' изначально

          Nul      man,12

          mov      fl,0

          mov      flag,0

          mov      m,0

          mov      m,0               ;количество целых символов 

vvodM:

        mov      ah,08             ;ввод символа с клавиатуры

          int      21H

         cmp    al,2bh     

          jne    next1

          mov    zn,2bh

          mov    flag,0

          out_sym

          cmp      al,2Dh            ;символ - '-' ?

          jne      next1             ;нет - дальше

          cmp      m,0               ;число цифр целой части = 0 ?

          jne      next1             ;нет - дальше

          cmp      flag,0

          jne      next1   

          mov      zn,2dh            ;да - zn='-'

          mov      flag,1

          Out_Sym                    ;вывод символа

          jmp      vvodM             ;ввод следующего символа

next1:

          cmp      al,0Dh            ;ENTER ?

          jne      next2             ;нет - дальше

          cmp      m,0               ;колличество цифр в целой части  = 0 ?

          jne      met1              ;нет -  на конец макроса

          mov      al,'0'

          Out_Sym

met1:     jmp      finOpIn

next2:

          cmp     al,'.'            ;'.' ?

          jne     next3             ;нет-дальше

          cmp    fl,0              ;была ли нажата раньше

          jne    next3             ;да-дальше

          cmp    m,0               ;если кол-во введеных знаков равно 0

          jne    tochka           

          mov      al,'0'            ;то выводим сначала 0 перед  точкой

          out_sym

tochka:

        set_kur 22,20

          scr_out varn4

          set_kur 10,28

          mov      al,'.'            ;выводим точку

          out_sym

          mov      m,5               ;так как нажата точка 

          mov      fl,1              ;кол-во введеных знаков равно 6 и установка флага

          jmp      vvodm

next3:   

          cmp      al,1bh            ;проверка на ESC

          jne      next4             ;нет-дальше

          end_task                   ;выход из программы

next4:

         cmp      al,30h            ;проверка на то

          jb       @113              ;была ли нажата 

          cmp      al,39h            ;цифра или нечто

          ja       @113              ;другое

          jmp      @114             

@113:

          jmp      vvodm

@114:

          cmp      m,3

          jae      met2              ;кол-во введеных знаков>=3

          out_sym                    ;нет-выводим символ 

          mov      cx,4              ;и начинаем здвиг

          mov      di,1

left:

         mov      dh,man[di]        ;сдвиг целой части

          mov      man[di-1],dh      ;на 4 разрядов

          inc      di                ;влево

          loop     left

          mov      man[4],al         ;заносим очередную цифру мантиссы в конец

          jmp      met5

met2:

        cmp    fl,0

          jne      met3              ;переполнение разрядной сетки в целой части

          set_kur 22,20

          scr_out varn1

          set_kur 23,16

          scr_out varn3

          set_kur 10,28

          jmp      vvodm

met3:

        cmp      m,8              ;кол-во введеных знаков

          jae      met4              ;>8

          Out_Sym

          xor      bx,bx            

          mov      bl,m

          mov      man[bx],al        ;заносим знак в мантису

         jmp      met5 

met4:

        set_kur 22,20

          scr_out varn1

          set_kur 23,17

          scr_out varn2

          jmp      vvodm             ;переполнение дробной части 

met5:

          inc      m                 ;увеличение счетчика 

          jmp      vvodm

finOpIn:

          mov      ah,02

          mov      bh,00

          mov      dh,15

          mov      dl,00

          int      10h

          Scr_Out  vopros1            ;правильно ли ввели число

povtor:

          pause

          cmp      al,79h             ;y-?

          jne      met6

          jmp     allfinal

met6:

          cmp      al,6eh             ;n-?

          jne      povtor

          cls      0000,184Fh

      jmp      vvod1 

allfinal:

ENDM      Op_In

;суммирование  мантис 

summa macro a,b,c

local sum

        nul      c,11             ;обнуление числа с

          asc_dec  a,10              ;приводим число  a

        asc_dec  b,10              ;приводим число  b

          asc_dec  c,11              ;приводим число  c

       mov      cx,10             ;кол-во итераций

        mov      si,11             ;начинаем суммирование с младших разрядов

       clc                        ;сброс флага cf

sum:

       mov      al,a[si]          ;в al цифру из числа a

       adc      al,b[si]          ;суммируем с учетом переноса с цифрой из числа b

       aaa                        ;коррекция 

       mov      c[si+1],al        ;заносим результат

       dec      si                ;уменьшаем si

       loop     sum               ;cx=cx-1 if cx=0 then

       mov      c,0               ;в старший разряд числа c заносим 0

       adc      c,0               ;суммируем с учетом переноса c 0

        dec_asc  a,10              ;приводим a к выводу

       dec_asc  b,10              ;приводим b к выводу

       dec_asc  c,11              ;приводим c к выводу

ENDM summa

;отнимание мантис (1-ая больше 2-ой)

raznost macro a,b,c

local razn

        nul      c,11              ;обнуление числа с

          asc_dec  a,10              ;приводим число  a

        asc_dec  b,10              ;приводим число  b

          asc_dec  c,11             ;приводим число  c

        mov      cx,10             ;кол-во итераций

       mov      si,11             ;начинаем отнимание с младших разрядов

          clc                        ;сброс флага cf

razn:

      mov      al,a[si]          ;в al цифру из числа a

       mov      bl,b[si]          ;в bl цифру из числа b

      sbb      al,bl             ;вычитаем с учетом заема

      aas                        ;коррекция

      mov      c[si+1],al        ;заносим результат

      dec      si                ;уменьшаем si

      loop     razn              ;cx=cx-1 if cx=0 then

        dec_asc  a,10              ;приводим a к выводу

        dec_asc  b,10              ;приводим b к выводу

        dec_asc  c,11              ;приводим c к выводу

endm raznost

mnog MACRO a,b             

local mett,met,smm,final,a1,a2

        nul      manmnog,20        ;обнуление разультата умножения

        asc_dec  a,10              ;приводим число  a

        asc_dec  b,10              ;приводим число  b

          asc_dec  manmnog,20        ;приводим разультат умножения

        mov      lop,0             ;первоначальное смещение=0

mett:                               

        nul      manc,11           ;обнуление промежуточного результата

          asc_dec  manc,11           ;приводим промежуточный результат

        mov      cx,10             ;кол-во итераций

        mov      si,9             ;начинаем умножение с младших  разрядов

        mov      bh,0              ;перенос из младших цифр 

met:

        mov      al,a[si]          ;в al цифру из числа a

        xor      di,di             ;формируем 

        mov      di,11             ;адрес

        sub      di,lop            ;[11-lop]

        mov      dl,b[di]          ;в bl цифру из числа b по адресу в di

        mul      dl                ;умножение 

        aam                        ;коррекция

Информация о работе Модель арифметико-логічного пристрою