Нижегородский Государственный Технический Университет

им.

Лабораторная работа№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

       

Контрольный пример.