Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет 2,3,4.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
31.19 Кб
Скачать

Лабораторная работа №3

«Работа со строками»

Цель: изучить команды обработки строк и приобрести навыки написания ассемблерных программ для реализации алгоритмов со строками.

Задача: Написать программу, удаляющую пробелы в конце строки.

Реализация кода:

.model small

.data;сегмент данных

string db 'Vvedite stroku', 13, 10, '$'; вывод на новую строку

nl db 13, 10, '$'; вывод на новую строку

max db 255;максимальное число символов

len db ?;определяет длину строки

stroka db 256 dup (?);выделяем 256 для строки

.stack 256; сегмент стека

.code;начало сегмента кода

start:

mov ax, @data; физический адрес сегмента данных в регистр ax

mov ds, ax

mov es, ax

lea dx, string; загрузка эффективного адреса+ производит перессылку на эффективного адреса данных в регистр dx

mov ah, 09h; вывод строки на экран

int 21h;вывод на экран string

inc ah ;это как функция ввода строки

lea dx, max

int 21h;вывод max

lea di, stroka;загрузка эффективного адреса+ производит перессылку на эффективного адреса данных в регистр di

mov al, len

xor ah, ah;обнуление

add di, ax;добавление ax в dx

dec di ;уменьшает на единицу di--

mov al, ' '; заносим в al ' '

mov cl, len

xor ch, ch;обнуление

std ; установить флаг направления(DF в 1)

repe scasb; префикс повторения сканированной цепочки или строки. сравнивает элементы строки задаваемый di

inc di ; di++

inc di

mov al, '$' ;вбиваем конец строки

stosb ;сохранение элемента в цепочке или в строке

mov ah, 09h

lea dx, nl

int 21h;ENTER

lea dx, stroka

int 21h;вывод на экран преобразованной строки

mov ah, 4ch;стандартный выход

int 21h

end start

Вывод: поставленная задача была выполнена. В процессе написания лабораторной, мы научились пользоваться оператором jmp, неаккуратное использование которого даже подвесила машину, на которой выполнялась лабораторная, а так же научились перехватывать входной поток данных для его последующей обработки.

Лабораторная работа №4

«Написание собственного обработчика прерывания»

Цель работы: ознакомиться с системой обработки прерываний микропроцессора в защищенном режиме. Научиться создавать собственные обработчики аппаратных прерываний.

Задание

Перейти в защищенный режим работы микропроцессора и в соответствии с номером варианта задания написать программу. При каждом вызове процедуры обработчика запроса на обслуживание прерывания обрабатывать только один элемент массива или выводить один элемент числовой последовательности.

Вариант 11- Перехватив прерывания от таймера, вывести последовательность факториалов натуральных чисел. Заполнение прекратить, когда числа выйдут за пределы 16-разрядной сетки.

Реализация кода:

data segment ;описание сегмента данных

time dw 18 ;таймер генерирует 18,2 сигнала в секунду 5 секунд это 91 прерывание

txt db '- faktorial',13,10,'$'

cnt dw 10

trii dw 1

KEEP_CS DW 0 ;хранит сегмент заменяемого прерывания

KEEP_IP DW 0 ;хранит смещение прерывания

data ends

code segment ;начало сегмента кода

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

assume cs:code ;

assume ds: data ;

assume es:stk ;

mov ax, data ;настройка сегмента данных

mov ds, ax

; сохраним вектор

MOV AH,25H ;функция получения вектора

MOV AL,8H ;номер вектора

INT 21H ;теперь сегмент в ES, смещение в BX

MOV KEEP_IP,BX ;запоминаем смещение

MOV KEEP_CS,ES ;запоминаем сегмент

push ds ;сохраняем DS

mov dx,offset rout ;смещение для процедуры в DX

mov ax,seg rout ;сегмент процедуры

mov ds,ax ;помещаем в DS

mov ah,25h ;функция установки вектора

mov al,8h ;номер вектора

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

pop ds ;восстанавливаем DS

b:

;cmp cnt,0

;jz codeend

jmp b

rout proc far

push ax ;сохраняем все изменяемые регистры

push dx

dec time

cmp time,0

jnz nxt

dec cnt

mov ax,18

mov time,ax

mov ax,trii

inc bx ; увеличение натуральных чисел на 1

mul bx ; результат хранится в ax

jc codeend

mov trii,ax

mov ax,trii

call PrintNumber

mov ah, 9

lea dx, txt ;берём адрес строки

int 21h

nxt:

pop dx

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

mov al,20h ;эти две строки надо использовать

out 20h,al ;только для аппаратных прерываний

iret

rout endp

PrintNumber proc ;процедура показа числа из ax

push bx ;записываем значения регистров в стек

push dx ;чтобы потом вернуть их

push si

push cx

mov cx, 0 ;инициализируем цикл

mov bx, 10 ;основание системы счисления

loophere: ;основной цикл

mov dx, 0 ;обнуляем dx

div bx ;делим на 10

push ax ;результат в стеке

add dl, '0' ;конвертируем посл.цифру в ASCII

pop ax ;вернем AX

push dx ;сохраним DX

inc cx ;увеличим cx

cmp ax, 0 ;повторяем для всех цифр числа

jnz loophere ;

mov ah, 2 ;dos-функция вывода символа

loophere2:

pop dx ;восстановим цифры от последней к первой

mov ah,02h

int 21h ;и напечатаем

loop loophere2

pop cx ;вернем значения регистров из стека обратно

pop si

pop dx

pop bx

ret

PrintNumber endp ;конец процедуры

codeend:

;восстановление вектора

CLI

PUSH DS ;DS будет разрушен

MOV DX,KEEP_IP ;подготовка к восстановлению

MOV AX,KEEP_CS ;

MOV DS,AX ;подготовка к восстановлению

MOV AH,25H ;функция установки вектора

MOV AL,1CH ;номер вектора

INT 21H ;восстанавливаем вектор

POP DS ;восстанавливаем DS

STI

mov ax, 4c00h ;функция завершения программы

int 21h ;завершаем программу

code ends ;конец сегмента кода

stk segment stack

db 256 dup('*')

stk ends

end start

Общий вывод: проделав лабораторную работу, я ознакомился с системой обработки прерываний микропроцессора в защищенном режиме.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]