Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО Лабораторные 1-5.docx
Скачиваний:
57
Добавлен:
16.02.2016
Размер:
75.45 Кб
Скачать

1,1,2,3,5,8,13,...(Каждое число в последовательности представляет собой сумму двух предыдущих чисел). Для организации цикла используйте команду loop.

.model small

.data

.stack 100h

.code

start:  mov ax,@data

    mov ds,ax

    mov es,ax

    mov ax,3

    int 10h

    mov ax,1

    mov bx,ax

    mov cx,12

    mov di, offset array

    mov si,di

cycle1: stosb

    add ax,bx

    xchg ax,bx

    loop cycle1

    mov di,offset buffer

    mov dx,di

    mov cx,12

cycle2: lodsb

    aam

    xchg ah,al

    or ax,'00'

    stosw

    inc di

    loop cycle2

    mov ah,9

    int 21h

    mov ah,0

    int 16h

    mov ah,4Ch

    int 21h

.data

array db 12 dup (?)

buffer db 32 dup (' '),'$'

end start

2. Напишите программу для вычисления сумму первых 15 нечетных чисел Фибоначчи с первыми 5 четными числами Фибоначчи. Суммы должны вычисляться в подпрограммах.

.model small

.data

.stack 100h

.code

start:

mov ax,@data

mov ds,ax

mov ax,1

mov bx,ax

mov cx,30

mov di, offset array

cld

cycle:

stosw ;Сохранение AX в ES:DI

add ax,bx

xchg ax,bx ;обмен между регистрами

loop cycle

call doCalcOdd

call doCalcEven

pop bx

pop ax

add ax,bx ;Сумма

int 10h

end start

;--------------------------------------------------

; doCalcOdd - процедура вычисления суммы нечетных чисел

;--------------------------------------------------

doCalcOdd proc near ;Начало описания процедуры

mov cx,15

mov di, offset odd_array

mov ax,0

push ax

cld

cycle:

stosw ;Сохранение AX в ES:DI

test ax,1

jnz @@AddOdd

@@AddOdd:

pop bx

add bx,ax

push bx

jmp @@Ex

@@Ex:

loop cycle

ret ;Выходим из процедуры

doCalcOdd endp ;Конец описания процедуры

;--------------------------------------------------

; doCalcEven - процедура вычисления суммы четных чисел

;--------------------------------------------------

doCalcEven proc near ;Начало описания процедуры

mov cx,5

mov di, offset odd_array

mov ax,0

push ax

cld

cycle:

stosw ;Сохранение AX в ES:DI

test ax,0

jnz @@AddEven

@@AddEven:

pop bx

add bx,ax

push bx

jmp @@Ex

@@Ex:

loop cycle

ret ;Выходим из процедуры

doCalcEven endp ;Конец описания процедуры

Лабораторная работа №3 Изучение экранных операций.

Цель работы: Объяснить требования для вывода информации на экран, а также для ввода данных с клавиатуры.

Общие сведения.

Данные, предназначенные для вывода на экран и ввода с клавиатуры, имеют ASCII - формат. Для выполнения ввода и вывода используется команда INT, которая прерывает обработку программы, передает управление в DOS или BIOS для определенного действия и затем возвращает управление в прерванную программу для продолжения обработки. Имеются два типа прерываний: команда BIOS INT 10Н и команда DOS INT 21H.

Команда INT 10Н включает в себя установку курсора в любую позицию и очистку экрана. Ниже приведены примеры установки курсора на S - ю строку и 12 столбец.

MOV АН, 02    ; запрос на установку курсора

MOV ВН, 00    ; экран 0

MOV DH, 05    ; строка 05

MOV DL, 12    ; столбец 12

INT    10Н        ; передача у правления в BIOS

И очистки всего экрана

MOV АН, 0600     ; АН 06 (прокрутка) AL 00 (весь экран)

MOV BH, 07         ; нормальный атрибут

MOV СХ, 0000     ; верхняя левая позиция

MOV DX, 184FH  ; нижняя правая позиция

INT         10H         ; передача управления в BIOS

Значение 02 в регистре АН указывает команде INT 10Н на выполнение операции установки курсора. Значение 06 в регистре АН указывает на выполнение операции очистки экрана.

Вывод на экран в DOS требует определения текстового сообщения в области данных, установки в регистре АН значения 09 и указания команды DOS INT 21H. В процессе выполнения операции конец сообщения определяется по ограничителю ($), как показано ниже:

INT  10H DB 'имя студента?', ‘$’

.

.

MOV АН, 09          ; запрос вывода на экран

LEA DX, INT 10Н ; загрузка адреса со общения

INT 21H                  ; вызов DOS

Для ввода данных с клавиатуры, область ввода требует наличия списка параметров, содержащего спецификацию полей, которые необходимы при выполнении команды INT: максимальная длина вводимого текста; поле, куда команда возвращает действительную длину введенного текста в байтах. Для запроса на ввод необходимо поместить в регистр АН номер функции – 10(OAH), загрузить адрес списка параметров в регистр DX и выполнить INT 21H.

Содержание задания.

  1. Напишите программу вывода на экран набора символов ASCII - кода.

.model tiny

.code

org 100h

start:

 

        mov ax,13h

        int 10h

        mov cx,256    ;Счетчик кругов для loop

        mov ax,0003h  ;Установка видеорижима 3, курсор в 0,0

        int 10h       ;и очистка экрана

        mov ax,0b800h

        mov es,ax     ;Загружаем в дополнительный сегментный регистр абсол.адрес

        mov di,0      ;Смещение относительно адреса 0b800h

        mov ah,010b   ;Атрибуты, цвет текста зеленый

        mov al,00h    ;ASCII код

        mov es:[di],ax ;Грузим не в регистр а по адресу который наход. в регистре

;----------------------

cloop:

        add di,4      ;Смещение на 4 байта, чтобы выглядело нормально

        inc al        ;Следущий ASCII код

        mov es:[di],ax ;Грузим по адресу в видеопамять

        loop cloop    ;Дальше...

;----------------------

        mov ah,10h    ;Ждем нажатие Any Key

        int 16h

ret

end start

  1. Напишите программу, запрашивающую ввод имени, а затем отображающую в средине экрана введенное имя.

.model small

.stack 256

.data

message1 db 'Введите имя: $'

message2 db 'Вы ввели имя: $'

nam db 20 dup (?)

.code

main:

mov ax,@data ;настройка ds

mov ds,ax

mov ax,0600h ;очистка экрана

mov bh,07h

mov cx,0

mov dx,184fh

int 10h

mov ax,0200h ;установка курсора

mov bh,0h

mov dh,7h

mov dl,18h

int 10h

mov ah,09 ;вывод запроса

lea dx,message1

int 21h

mov si,0h

go: xor ax,ax ;цикл ввода

mov ah,1h

int 21h

mov nam[si],al

inc si

cmp al,13 ;если не Enter-

jnz go ;продолжать

mov ax,0200h ;установка курсора

mov bx,0h

mov dh,8h

mov dl,32h

int 10h

mov nam[si],24h ;код символа $

lea dx,message2 ;вывод сообщения

mov ah,09h

int 21h

lea dx,nam ;вывод имени

mov ah,09h

int 21h

mov ah,1h ;readkey

int 21h

mov ax,4c00h ;завершение программы

int 21h

end main