Микропроцессоры и микрокомпьютеры

Автор: Пользователь скрыл имя, 26 Сентября 2011 в 00:48, контрольная работа

Краткое описание

Механизм шлюзов для передачи управления на сегменты кода с другими уровнями привилегий

Файлы: 1 файл

Контрольная по микропроцессорам.doc

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

      Loop  massiv2_out_loop ; идём обрабатывать следующий элемент

;****************************************************************************

      mov  ah, 9   ;

      lea  dx, AbzacMessage ;

      int  21h   ; делаем "абзац"

;****************************************************************************

_Repeat:    ; метка "повтор"

      mov  ah, 9   ;

   lea  dx, RepeatMessage ; выводим сообщение о необходимости повтора

   int  21h   ;

GetKey_1:     ; метка опроса клавиш

      Mov ah, 1       ; код функции "проверка готовности"

      Int 16h       ; обращение к BIOS

      jz  GetKey_1     ; символ не введён, возвращаемся на начало

          ; подпрограммы

      xor ah, ah  ; код функции "чтение символа в AL"

  int 16h   ; обращение к BIOS

      Cmp ah, 1Ch  ; введён символ Enter?

      Jne GK_1   ; нет; идём на метку

      Mov Ax, 0   ; обнуляем

      Mov _counter, AX ; счётчик элементов

      lea BX, In_massiv ; заносим в регистр bx адрес входного массива

      xor SI, SI  ; SI=0

      mov CX, 100  ; Счетчик повторений - 100

      mov AX, 0   ; Заполнитель

nulmas:    ; очистим входной массив элементов

      mov  [BX][SI], AX ; Очистка элемента массива

      inc  SI   ; Сдвиг к следующему

      inc  SI   ; слову массива

      loop  nulmas  ; Повторить CX раз

      jmp main   ; прыгаем к основному циклу массива

GK_1:

      Cmp  al, 1Bh  ; введён символ Esc ?

      Jne getkey_1  ; идём на опрос ожидание ответа, если нет

      int 20h   ; выходим из программы

;****************************************************************************

;**** Вывод символа, ASCII код которого находится в  al **********************

;****************************************************************************

OutSym:

   push  ax        ; сохранение содержимого ax

   push  bx        ; сохранение содержимого bx

   mov   ah, 0Eh   ; ah = код функции BIOS

   mov   bx, 07h  ; цвет переднего плана (цифр)

   int   10h    ; обращение к BIOS для вывода символа

   pop   bx        ; восстановление содержимого bx

   pop   ax      ; восстановление содержимого ax

   ret      ; возврат на вызывающий модуль

;****************************************************************************

; Далее записаны  выводимые на экран сообщения,  и одна используемая переменная

;****************************************************************************

StartMessage db "Программа  Pro8_4_1.com. Написал Шумель Владимир, 8 вариант.", 0Dh, 0Ah, 0Ah, \

"Максимальное  количество элементов массива  - 100. Вводите элементы, разделяя их  клавишей (space). Максимальное значение  вводимого элемента - 10000. После ввода нужного числа элементов массива нажмите (enter). Для выхода из программы нажмите(esc).", 0Dh, 0Ah, 0Ah, 24h 

MainMessage db "Введите  элементы массива:", 0Dh, 0Ah, 0Ah, 24h 

Mass1Message db "Массив, содержащий остатки от деления на 10 элементов первого массива:", 0Dh, 0Ah, 0Ah, 24h 

Mass2Message db "Массив, содержащий произведения на 2 элементов  первого массива:", 0Dh, 0Ah, 0Ah, 24h 

RepeatMessage db "Для  повторения нажмите (enter), для выхода  нажмите (esc).", 0Dh, 0Ah, 0Ah, 24h 

AbzacMessage db 0Dh, 0Ah, 0Ah, 24h 

In_massiv  dw  100 dup (0)

_counter  dw  0

_Flag  db 1  

CSEG ends    ; метка конца программы в программном сегменте

End Begin    ; метка конца программы. 

    Программа Pro8_4_2.

    Ввести  строку и удалить из нее все  имеющиеся цифры. Результат вывести на экран. 

    Листинг программы: 

     SCEG SEGMENT  ; имя сегмента, в котором находится программа

     org  100h   ; начинается программа со смещения 100h

;**************************************************************************

Start:    ; метка начала программы

      mov  ah, 9   ; будем выводить строку символов

      lea  dx, StartMessage ; с адресом в dx

      int  21h   ; вызываем прерывание DOS

;**************************************************************************

Main:     ; метка начала программы

      mov  ah, 9   ;

   lea  dx, MainMessage ; выводим сообщение о введении символов

   int  21h   ;

M_1:      ; метка основного цикла программы

      Call GetKey  ; вызываем подпрограмму получения символа

      Cmp al, 1Bh  ; сравниваем введённый символ с Esc

      Je _quit   ; если равен ? то идём на метку выхода

      Cmp ah, 1Ch  ; сравниваем скан-код клавиатуры с Enter

      Je _vyvod  ; если равен ? то идём на вывод массива

      Call outsym  ; вызываем эхоотображение символа

      Cmp al, '0'  ; код символа < кода нуля?

   jb    nodig   ; да, символ не цифра, идём на запись в массив

   cmp   al, '9'  ; код символа > кода девятки?

   ja    nodig    ; да, символ не цифра, идём на запись в массив

      jmp M_1   ; иначе идём получать очередной символ  

nodig:    ; метка обработки не цифр

      mov SI, _counter ; записываем в регистр значение счётчика

               ; символов

      mov out_mas[SI], al ; записываем в выходной массив по смещению в SI

                              ; символ из al

      inc _counter  ; инкрементируем значение счётчика

      jmp M_1   ; идём на получение очередного символа

_vyvod:    ; метка вывода полученного массива без цифр

      mov  ah, 9   ;

   lea  dx, MasMessage ; выводим сообщение о выходном массиве

   int  21h   ;

      Mov cx, _counter ; заносим в счётчик цикла значение счётчика

          ; элементов

      Xor SI, SI  ; обнуляем регистр SI

_vyvod_loop:   ; метка начала цикла

      Mov al, out_mas[SI] ; читаем в регистр al символ из массива по

          ; смещению в SI

      Call OutSym  ; вызываем отображение символа

      Inc SI   ; инкрементируем номер элемента

      Loop _vyvod_loop  ; повторяем, пока не дойдём до конца массива

;*********************************************************************

_Repeat:    ; метка "повтор"

      mov  ah, 9   ;

   lea  dx, RepeatMessage ; выводим сообщение о необходимости повтора

   int  21h   ;

getkey_1:    ; метка

      call GetKey  ; вызываем подпрограмму получения символа

      Cmp ah, 1Ch  ; введён символ Enter?

      Jne GK_1   ; нет; идём на метку

      xor ax, ax  ; обнуляем

      Mov _counter, AX ; счётчик элементов

      lea BX, Out_mas  ; заносим в регистр bx адрес входного массива

      xor SI, SI  ; SI=0

      mov CX, 1000  ; Счетчик повторений - 1000

      mov AX, 0   ; Заполнитель

nulmas:    ; очистим входной массив элементов

      mov  [BX][SI], AX ; Очистка элемента массива

      inc  SI   ; Сдвиг к следующему байту массива

      loop  nulmas  ; Повторить CX раз

      jmp start   ; прыгаем к основному циклу массива

GK_1:     ; метка

      Cmp  al, 1Bh  ; введён символ Esc ?

      Jne getkey_1  ; идём на опрос ожидание ответа, если нет

      int 20h   ; выходим из программы

;************************************************************************* 

OutSym:     ; вывод символа из al

   push  ax        ; сохранение содержимого ax

   push  bx        ; сохранение содержимого bx

   mov   ah, 0Eh   ; ah = код функции BIOS

   mov   bx, 4fh  ; цвет переднего плана (цифр)

   int   10h    ; обращение к BIOS для вывода символа

   pop   bx        ; восстановление содержимого bx

   pop   ax      ; восстановление содержимого ax

      ret    ; возвращаемся на вызывающий модуль

;*************************************************************************

GetKey:     ; метка подпрограммы вводва символа  

   Mov ah, 1   ; код функции "проверка готовности"

      Int 16h   ; обращение к BIOS

      Jz GetKey  ; символ не введён, возвращаемся на начало

                              ; подпрограммы

      Xor ah, ah  ; код функции "чтение символа в AL"

      Int 16h   ; обращение к BIOS

      Ret    ; возвращаемся на вызывающий модуль

;*************************************************************************

_quit:    ; метка выхода

      Int 20h   ; выходим из программы

;************************************************************************* 

StartMessage  db "Программа Pro8_4_2.com. Написал Шумель Владимир, 8 вариант.", 0Dh, 0Ah, 0Ah, "Вводите символы, при наборе нужного количества символов нажмите Enter, для выхода из программы нажмите Esc.", 0Dh, 0Ah, 0Ah, 24h, 

MainMessage  db "Введите строку:", 0Dh, 0Ah, 0Ah, 24h 

MasMessage   db 0Dh, 0Ah, 0Ah, "Введённая строка, из которой удалены все цифры:", 0Dh, 0Ah, 0Ah, 24h 

RepeatMessage  db 0Dh, 0Ah, 0Ah, "Для повторения нажмите (enter), для выхода нажмите (esc).", 0Dh, 0Ah, 0Ah, 24h 

Out_mas  db  1000 dup (0)

_counter  dw 0 

SCEG  ENDS    ; конец сегмента

END  Start    ; конец программы 
 
 
 

    Задание 5.  Программирование с использованием bios 

    Программа Pro8_5_1.

    Построить изображение красного окна 16х16. Организовать вывод вводимого текста в окно. Текст вводится построчно. Переход на следующую строку производится автоматически /программой/. Цвет символов - белый, программа должна завершать работу при вводе  "$".  

    Листинг программы: 

     CSEG segment ; имя сегмента программы

    org 100h  ; начинаем её со смещения 100h

     Start:  ; метка начала программы

;*******************************************************************************

      mov  ah, 0h ;Установка видео режима

      mov  al, 3h ;AL = режим(текст,80x25,16/8)

      int  10h      ;Видео сервис

;*******************************************************************************

Black_screen: ; делаем экран чёрным (на случай, если запускали из

; командной строки)

      mov  ax, 0B800h ; сегмент видеопамяти

      mov  es, ax ; заносим в es

      mov  di, 0  ; положение элемента на экране ? 0, то есть верхний

          ; левый угол

      mov  al, 0  ; заносим в al символ (пусто)

      mov  ah, 07h ; заносим в ah атрибут символа (серый на чёрном фоне)

      mov  cx, 2000 ; заносим в cx число повторений (2000, весь экран)

Информация о работе Микропроцессоры и микрокомпьютеры