Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛПЗ(8-10).docx
Скачиваний:
7
Добавлен:
17.11.2018
Размер:
60.24 Кб
Скачать

Лабораторные работу по курсу «Микропроцессоры и микропроцессорные системы»

Содержание

Лабораторные работу 0

по курсу 0

«Микропроцессоры и микропроцессорные системы» 0

1. Лабораторная работа №8 2

1.1. Задание 2

1.2. Блок-схема алгоритма 2

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

1.4 Результаты работы программы 4

2. Лабораторная работа №9 4

2.1. Задание 4

2.2. Блок-схема алгоритма 5

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

2.4 Результаты работы программы 12

3. Лабораторная работа №10 13

3.1. Задание 13

3.2. Блок-схема алгоритма 13

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

3.4 Результаты работы программы 24

1. Лабораторная работа №8 2

1.1. Задание 2

1.2. Блок-схема алгоритма 2

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

1.4 Результаты работы программы 4

2. Лабораторная работа №9 4

2.1. Задание 4

2.2. Блок-схема алгоритма 4

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

2.4 Результаты работы программы 12

3. Лабораторная работа №10 13

3.1. Задание 13

3.2. Блок-схема алгоритма 13

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

3.4 Результаты работы программы 24

1. Лабораторная работа №8

1.1. Задание

Ввести строку символов, а затем вывести в обратном порядке.

1.2. Блок-схема алгоритма

1

2

3

4

5

6

7

9

8

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

data segment

mes1 db 'Введите строку (не более 100 символов) : ','$'

mes2 db 0Ah,0Dh,'Полученная строка: ','$'

buff db 100,0

db 101 dup (?)

data ends

stack segment stack

db 10 dup (?)

stack ends

code segment

assume cs:code,ds:data,ss:stack;

main:

mov ax, data

mov ds, ax

mov ax,stack

mov ss, ax

mov ah,09

lea dx,mes1

int 21h ;Вывод сообщения mes1

mov ah,0ah

lea dx,buff

int 21h ;Ввод строки от пользователя в память по адресу buff

mov ah,09

lea dx,mes2

Int 21h ;Вывод сообщения mes2

lea bx,buff+1 ;bx указывает на ячейку памяти, где находиться длина строки

xor cx,cx

mov cl,[bx] ;cl = длина введённой строки

cmp cl,0

jz ending ;Выход, если строка пустая

lea bx,buff+2

add bx,cx ;bx указывает на последний символ строки+1

outp:

dec bx ;Уменьшаем bx на 1

mov ah,02

mov dl,[bx]

int 21h ;Выводим символ по адресу [bx]

loop outp ;Повторяем цикл

ending:

mov ah,4ch

int 21h ;Завершение программы

code ends

end main

1.4 Результаты работы программы

Тест 1.

Введите строку (не более 100 символов) : qwerty

Полученная строка: ytrewq

Тест 2.

Введите строку (не более 100 символов): qqqqqqqqqwwwwwwwwweeeeeeeeerrrrrrrrrttt

tttttttyyyyyyyyyyuuuuuuuuuuuiiiiiiiiiiiioooooooooooooooppppp

Полученная строка: pppppoooooooooooooooiiiiiiiiiiiiuuuuuuuuuuuyyyyyyyyyytttttttt

ttrrrrrrrrreeeeeeeeewwwwwwwwwqqqqqqqqq

2. Лабораторная работа №9

2.1. Задание

Дано натуральное число n, целые числа а12,…,аn. Найти количество и сумму тех членов данной последовательности, которые делятся на 5 и не делятся на 7. Ввод и вывод организовать через текстовый файл.

2.2. Блок-схема алгоритма

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

.386

data segment use16

buff_tx db 2048 dup (?) ;Текстовый буфер

point_o dw ? ;Указатель в выходном буфере

cur_n dw ? ;Адрес начала тек. числа в ASCII формате

next_n dw ? ;Адрес начала след. числа

exit db 0 ;Указатель выход/не выход из процедуры

error db 0 ;Указатель ошибки

summ1 dd 0 ;Рез. суммир-ия чисел / на 5 и не / на 7

summ dd 0 ;Результат сложения двух 32-битных чисел

count db 0 ;Кол. чисел / на 5 и не / на 7

del dd 10 ;Делитель

F_Len dw ? ;Длина входного файла

File_in db 'task2_in.txt',0 ;Имя входного файла

Handle1 dw 1 ;Описатель 1-го файла

File_ou db 'task2_ou.txt',0 ;Имя входного файла

Handle2 dw 1 ;Описатель 2-го файла

mes1 db 'Ошибка. Невозможно открыть файла "task2_in.txt".',0ah,0dh,'$'

mes2 db 'Ошибка. Недостаточно данных в исходном файле.',0ah,0dh,'$'

mes3 db 'Ошибка. Разрядность исходного числа превышает формат короткого целого.',0ah,0dh,'$'

mes4 db 'Ошибка. Разрядность результата сложения больше разрядности короткого целого.',0ah,0dh,'$'

mes5 db 'Ошибка. Размер файла больше 2048 байт.'

mes6 db 'Ошибка. Невозможно создать файл "task2_ou.txt".',0ah,0dh,'$'

mes7 db 'Ошибка. Невозможно записать в файл "task2_ou.txt".',0ah,0dh,'$'

mes8 db 'Ошибка. Исходный файл "task2_in.txt" пустой.',0ah,0dh,'$'

mes9 db 'Нет ниодного числа, которое делится на 5 и не делится на 7',0Ah,0Dh,'$'

data ends

stack segment use16 stack

db 100 DUP(?)

stack ends

code segment use16

assume cs:code,ds:data,es:data,ss:stack;

main:

mov ax,data

mov ds,ax

mov ax,stack

mov ss,ax

lea dx,File_in

mov ah,3Dh

mov al,0

int 21h ; Открытие файла 'task2_in.txt'

jc Open_e

mov Handle1,ax

mov bx,ax

mov ah,3Fh

mov cx,2048

lea dx,buff_tx

int 21h ; Чтение 2048 байт файла

mov F_len,ax

mov ah,3Eh

mov bx,handle1

int 21h ; Закрытие файла

mov ax,F_len ;Проверка на пустой файл

cmp ax,0

jz err7

cmp ax,2048 ;Проверка на слишком большой файл

jz err3

mov ah,3ch ;Создаём новый файл

lea dx,file_ou ;С именем 'task2_ou.txt

xor cx,cx ;

int 21h

jc err5 ;Если ошибка,идём на обработку

mov Handle2,ax

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

;Начинаем обработку входного файла

lea bx,buff_tx ;В ВХ адрес начала буфера

rep1: mov cur_n,bx

call find_n ;Определяем кол-во цифр первого числа

cmp ah,0

jz rep1 ;Повтрить, если число не найдено

mov si,cur_n ;SI-расположение переводимого числа

call ASC_N ;Перевод числа в двойчный формат

cmp error,1

jz term ;Если ошибка, то выходим

mov cx,ax ;В СХ-количество чисел для обработки

mov point_o,offset Buff_tx ;Указатель в буф. для записи уст на нач.

repeat: mov bx,next_n

mov cur_n,bx

call find_n ;Выясняем количество символов числа

mov si,cur_n

call ASC_N ;Переводим число в двойчный формат

cmp error,1

jz term

push eax

xor edx,edx

mov ebx,5

div ebx ;Делим число на 5

cmp edx,0

pop eax

jnz rep3 ;Если не делится, то переходим к след.

push eax

mov ebx,7

div ebx ;Делим число на 7

cmp edx,0

pop eax

jz rep3 ;Если делится на 7, то переходим к след.

inc count ;Увеличиваем счётчик количества чисел

add summ1,eax ;Суммируем числа

jc err2 ;Если переполнение идём на обработку

mov di,point_o

call N_ASC ;Записываем числа в ASCII формате в буф.

add bx,point_o

mov [bx],byte ptr ','

inc bx

mov point_o,bx ;Увеличиваем указатель в буфере

rep3:

mov bx,next_n

sub bx,offset buff_tx

cmp bx,F_len ;Если достигнут конец файла, то выходим

ja err4

rep4: loop repeat

cmp count,0

jz err8

dec point_o ;Уменьшаем указатель, затирая запятую

mov bx,point_o ;

mov [bx],word ptr 0d0ah ;Заносим в буфер LF и CR

inc point_o ;

inc point_o ;Увеличиваем указатель на 2

xor eax,eax

mov al,count

mov di,point_o

call N_ASC ;Выводим количество чисел

add point_o,bx

mov bx,point_o

mov [bx],word ptr 0d0ah

inc point_o

inc point_o

mov eax,summ1

mov di,point_o

call N_ASC ;Выводим их сумму

add point_o,bx

lea dx,buff_tx

mov cx,point_o

sub cx,offset buff_tx

output: mov bx,Handle2

mov ah,40h ;Записываем в файл

int 21h

jc err6 ;Если ошибка идём на обработку

jmp end_p

Open_e: ; Вывод сообщения об ошибке открытия

lea dx,mes1

mov ah,09h

int 21h

jmp end_p

err2: lea dx,mes4 ;Вывод сообщения об ошибке сложения

mov ah,09

int 21h

lea dx,mes4

jmp end_p

err3: lea dx,mes5 ;Вывод сообщения о большом размере файла

mov ah,09

int 21h

jmp end_p

err4: cmp cx,1 ;Если все заявленные в начале числа про-

jz rep4 ;верены, то завершаем цикл.

lea dx,mes2 ;Вывод сообщ. о недостатке данных

mov ah,09

int 21h

jmp end_p

err5: lea dx,mes6 ;Выв. сообщения об ошибке создания файла

mov ah,09

int 21h

jmp end_p

err6: lea dx,mes7 ;Выв. сообщения об ошибке записи в файл

mov ah,09

int 21h

mov bx,Handle2 ;Закрытие файла

mov ah,3eh

int 21h

jmp end_p

err7: lea dx,mes8 ;Вывод сообщения о пустом исходном файле

mov ah,09h

int 21h

jmp end_p

err8: lea dx,mes9 ;Нет ниодного числа / на 5 и не / на 7

mov ah,09

int 21h

jmp end_p

Term: jmp end_p

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

;Процедура ищет в строке с адресом [bx] число, занося в AH кол-во цифр числа, и занося

;в ячейку next_n и регистр BX адрес след. числа

find_n proc near

push cx

mov exit,0

mov ah,0

begin:

push bx

sub bx,offset buff_tx

cmp bx,F_len ;Проверяем достигнут ли конец файла

pop bx

ja f_exit

mov al,[bx]

cmp al,30h

jnc down1 ; Если выше или равно

inc bx

mov exit,1

jmp begin

down1: cmp al,3Ah

jc adding ; Если ниже

inc bx

mov exit,1

jmp begin

adding:

cmp exit,1

jz f_exit ; Выход, если BX на позиции след. числа

inc ah ; Увеличиваем счётчик кол-ва цифр

inc bx ; Сдвигаем указатель

jmp begin ; На начало

f_exit: mov next_n,bx

pop cx

ret

find_n endp

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

;Процедура преобразует число в ASCII символах длины AH, по адресу [SI]

;в двоичный формат, помещая его в EAX, error=1 означает ошибку

ASC_N proc near

push cx

mov summ,dword ptr 0

mov bl,ah

xor bh,bh

mov ecx,1

xor dx,dx

rep2:

cmp bl,0

jz end2

xor eax,eax

mov al,[SI+BX-1]

xor ax,30h

mul ecx

add summ,eax

jc err1 ;Если ошибка переполнения

mov eax,ecx

mul del

mov ecx,eax

dec bx

jmp rep2

err1: mov error,1

mov ah,09

lea dx,mes3

int 21h

end2: mov eax,summ

pop cx

ret

ASC_N endp

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

;Процедура преобразует число (короткое целое) из 2-го формата из рег-ра EAX

;в набор ASCII символов и размещает их по адресу DI, BX содержит кол-во цифр.

N_ASC proc near

xor bx,bx

beg1:

xor edx,edx

div del ;Делим на 10

or dx,30h ;Прибавляем к остатку 30h

push dx ;Сохраняем в стеке

inc bx ;Увеличиваем счётчик кол-ва цифр

cmp eax,0

jnz beg1 ;Если частное>0 то перевод не закончен

mov dx,bx

xor bx,bx

fill: ;Размещаем символы из стека по адресу DI

pop ax

dec dx

mov byte ptr [di+bx],al

inc bx

cmp dx,0

jnz fill

ret

N_ASC endp

end_p:

mov bx,Handle2 ;Закрытие выходного файла

mov ah,3eh

int 21h

mov ax,4c00h

int 21h

code ends

end main