Нижегородский Государственный Технический Университет
им.
Лабораторная работа№2
по дисциплине «Системное программное обеспечение»
Тема: Программная модель процессора и программирование в кодах
Выполнил:
студент 10-В-1
Проверил:
Нижний Новгород
2012 г.
Задание.
Написать программу на Ассемблере, выполняющую ввод последовательности кодов символов с клавиатуры, обработку кодов в соответствии с заданием и вывод на экран результирующей последовательности.
Заданное условие: Перестановка a(n),a(n-1),a(n-2),...,a(n/2),a(1),a(2),...,a(n/2-1).
Алгоритм решения задачи.
Организуем два цикла, каждый с количеством итераций равным n/2. В первом цикле перемещаем данные из исходных, начиная с конца. Это возможно сделать уменьшая смещение на 1 при каждой итерации. Во втором цикле перемещаем данные, начиная с первого знака, но продолжая заполнять массив выходных данных.
Организация ввода-вывода.
Ввод данных организован при помощи функции 0Ah прерывания 21h (ввод строки с клавиатуры с ожиданием и эхом. Адрес буфера ввода - ds:dx, первый байт буфера - его размер, второй – число реально введенный байтов. Окончание ввода – Enter (0Dh))
Вывод – при помощи функции 9 этого же прерывания.
Код программы:
d1 segment para public 'data';объявление сегмента
BSDate db 10 dup ('$');выделение 10 байтов, заполненных $
mess1 db 10,13,'Input symbol',10,13,'$';инициализация строки
in_symbol db 22 dup (?);выделение 22 байтов, не заполненных
d1 ends; окончание сегмента
e1 segment para public 'data'
mess2 db 'Output:',10,13,'$'
out_str db 22 dup ('$')
e1 ends
c1 segment para public 'code'
assume cs:c1,ds:d1,es:e1,ss:st1; соответствие между сегментными регистрами, и программными сегментами.
start: mov ax, d1;помещение сегмента в аккумулятор
mov ds, ax; помещение содержимого аккумулятора в регистр
mov ax, e1
mov es, ax
push es;помещение в стек
mov ax,0ffffh;помещение в аккумулятор значения
mov es, ax;запись из аккумулятора в регистр
mov si,5; запись в регистр данных
mov cx,8
mov di, offset BSDate
BS: mov al, es:[si];запись в нижний байт аккумулятора данных из es со смещением si
mov [di],al запись по смещению di данных из аккумулятора
inc si;увеличение значения si
inc di
loop BS; переход к метке BS
mov dx, offset BSDate;запись в dx строки BSDate
mov ah,9;помещение в верхний байт аккумулятора
int 21h; прерывание 21h
pop es;вывод из стека
mov dx, offset mess1
mov ah,9
int 21h
mov dx, offset in_symbol
mov in_symbol,20
mov ah,0ah
int 21h
mov di, offset in_symbol+2 ;позиция исходных данных
mov si, offset out_str ;позиция выходных данных
mov ch,0; обнулим верхний байт cx
mov cl, in_symbol+1;поместим в cl количество введенных символов
mov bl, cl
shr cl,1;сдвиг вправо на один байт = деление на два
bcwd: mov al,[bx+di-1]
mov es:[si],al
dec bl
inc si
loop bcwd
mov cl, in_symbol+1
shr cl,1
frwd: mov al,[di]
mov es:[si],al
inc si
inc di
loop frwd
mov ax, es
mov ds, ax
mov dx, offset mess2
mov ah,9
int 21h
mov dx, offset out_str
mov ah,9
int 21h
mov ah,7
int 21h
mov ax,4c00h
int 21h
c1 ends
st1 segment para stack 'stack'
dw 150 dup (?)
st1 ends
end start
Контрольный пример.



