
Лабораторная работа №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
Общий вывод: проделав лабораторную работу, я ознакомился с системой обработки прерываний микропроцессора в защищенном режиме.