лаб 4 по системному

Міністерство освіти і науки України

Одеський державний екологічний університет

Кафедра інформаційних технологій

ПРОТОКОЛ ЛАБОРАТОРНОЇ РОБОТИ №4

з системного програмування та операційних систем

тема або назва лабораторної роботи: Робота з циклами, буферами та строками

виконав студент групи К-33_ Фоменко В.В.

Оцінка за підготовку до роботи

(теоретична частина)

Оцінка за виконання роботи

(практична частина)

Оцінка за захист роботи

(остаточна, загальна кількість балів)

Одеса 2010

Задание к лабораторной работе

Как известно, квадрат любого целого положительного числа может быть

вычислен по следующему алгоритму:

1^2 = 1;

2^2 = 1 + 3;

3^2 = 1 + 3 + 5;

4^2 = 1 + 3 + 5 + 7;

5^2 = 1 + 3 + 5 + 7 + 9;

используя операцию loop или ее модификации, разработать программу вычисления квадрата чисел, длиной до 16 двоичных разрядов включительно.

На основе этого алгоритма разработать и программно осуществить алгоритм

нахождения квадратного корня из целого 16-и разрядного числа.

Как мы уже знаем, вывод в файл осуществляется через буфер данных, обычно длиной в 128 байт. Считая, что содержимое самого файла, длина которого больше и не кратна 128 байтам, находится в ОЗУ начиная с адреса B800h:0000h, а буфер расположен по адресу некоторой метки FileBuf в Вашей программе, произвести циклическое заполнение буфера данными, используя команды пересылки массивов.

Сразу, после запуска программы, до установки DS на свой сегмент данных, используя адрес, находящийся по смещению DS:002ch, с помощью команд обработки массивов, найти следующую строку байт FARLANG, и определить ее адрес в ОЗУ.Теоретическая часть

 Команда:

MOVS приемник, источник

 Назначение:

Копирование строки

 Команда:

MOVSB

 Назначение:

Копирование строки байт

 Команда:

MOVSW

 Назначение:

Копирование строки слов

 Команда:

MOVSD

 Назначение:

Копирование строки двойных слов

Копирует один байт (MOVSB), слово (MOVSW) или двойное слово (MOVSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) в память по адресу ES:EDI (или ES:DI). При использовании формы записи MOVS ассемблер сам определяет из типа указанных операндов (принято указывать имена копируемых строк, но можно использовать любые два операнда подходящего типа), какую из трех форм этой команды (MOVSB, MOVSW или MOVSD) выбрать. Используя MOVS с операндами, можно заменить регистр DS на другой с помощью префикса замены сегмента (ES:, GS:, FS:, CS:, SS:), регистр ES заменить нельзя. После выполнения команды регистры ESI (SI) и EDI (DI) увеличиваются на 1, 2 или 4 (если копируются байты, слова или двойные слова), если флаг DF = 0, и уменьшаются, если DF = 1. При использовании с префиксом REP команда MOVS выполняет копирование строки длиной в ЕСХ (или СХ) байт, слов или двойных слов.

 Команда:

LOOP метка

 Назначение:

Цикл

Уменьшает регистр ЕСХ на 1 и выполняет переход типа short на метку (которая не может быть дальше, чем на расстоянии от -128 до +127 байт от команды LOOP), если ЕСХ не равен нулю. Эта команда используется для организации циклов, в которых регистр ЕСХ (или СХ при 16-битной адресации) играет роль счетчика.

Команда LOOP полностью эквивалентна паре команд

dec ecx

jz метка

Но LOOP короче этих двух команд на один байт и не изменяет значения флагов.

 Команда:

LOOPE метка

 Назначение:

Цикл, пока равно

 Команда:

LOOPZ метка

 Назначение:

Цикл, пока ноль

 Команда:

LOOPNE метка

 Назначение:

Цикл, пока не равно

 Команда:

LOOPNZ метка

 Назначение:

Цикл, пока не ноль

Все эти команды уменьшают регистр ЕСХ на один, после чего выполняют переход типа short, если ЕСХ не равен нулю и если выполняется условие. Для команд LOOPE и LOOPZ условием является равенство единице флага ZF, для команд LOOPNE и LOOPNZ — равенство флага ZF нулю. Сами команды LOOPcc не изменяют значений флагов, так что ZF должен быть установлен (или сброшен) предшествующей командой.

CLD – Сбрасывает флаги DF в 0, так что при последующих строковых операциях регистры DI и SI будут увеличиваться.

 Команда:

CMPS приемник, источник

 Назначение:

Сравнение строк

Сравнивает один байт, слово или двойное слово из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) с байтом, словом или двойным словом по адресу ES:EDI (или ES:DI) и устанавливает флаги аналогично команде СМР. При использовании формы записи CMPS ассемблер сам определяет из типа указанных операндов (принято указывать имена сравниваемых строк, но можно использовать любые два операнда подходящего типа), какую из трех форм этой команды (CMPSB, CMPSW или CMPSD) выбрать. Используя CMPS с операндами, можно заменить регистр DS на другой, применяя префикс замены сегмента (ES:, GS:, FS:, CS:, SS:), регистр ES заменить нельзя. После выполнения команды регистры ESI (SI) и EDI (DI) увеличиваются на 1, 2 или 4 (если сравниваются байты, слова или двойные слова), если флаг DF = 0, и уменьшаются, если DF = 1. При использовании с префиксом REP команда CMPS выполняет сравнение строки длиной в ЕСХ (или СХ) байт, слов или двойных слов.

Листинг программы:

;Программа нахождения квадрата числа

.model small

.stack 100h

.data

b dw 4d

sqr dw 0

.code

start:

mov ax,@data

mov ds,ax

xor ax,ax

mov bx,1

mov cx,b

Label1:

add ax,bx

inc bx

inc bx

loop Label1

mov sqr,ax

mov ah,4ch

int 21h

end start

;Программа нахождения корня числа

.model small

.stack 100h

a dw 16

sqr dw o

.code

start:

mov ax,@data

mov ds,ax

mov ax,b

mov bx,0

mov dx,1

sloop:

sub ax,dx

inc bx

add dx,2

cmp ax,0

jns sloop

mov sqr,bx

mov ah,4ch

int 21h

end start

;Программа циклического заполнения буфера данными

.model small

.stack 100h

.data

FileBuf db 128d dup(0) ;заносим длину 128

.code

mov ax,@data ;указывает на начало сегмента данных

mov es,ax

mov ax,0b800h

mov ds,ax

mov si,0000h

mov ax,4000d ;размер файла

mov bx,128d

div bx ; определяем сколько раз в файл вмещается буфер

dec ax

metka:

mov cx,128d ;счётчик цикла movsb

mov di,offset Filebuf ;заносим начало буфера

rep movsb

dec ax ;счётчик цикла заполнения Filebuf

jnz metka

mov di,offset Filebuf

mov cx,dx

rep movsb

mov ah,4ch

int 21h

end

;Программа поиска строки FARLANG в ОЗУ

.model small

.stack 100h

.data

string db «FARLANG»

Len EQU ($-string)

.code

cld ;для увеличения si, di

mov si,002Ch

mov ax,ds:[si]

mov es,ax

mov ax,@data

mov ds,ax

xor di,di ;di=0

;цикл проверки

next:

mov si,offset string

mov cx,Len ;счётчик

repe cmpsb ; повторяем пока символы равны или не cx=0

jnz next

;di-адрес ОЗУ

sub di,len

mov ax,di

mov ah,4ch

int 21h

end