Мегаобучалка Главная | О нас | Обратная связь


Пример рекурсивной функции



2018-07-06 326 Обсуждений (0)
Пример рекурсивной функции 0.00 из 5.00 0 оценок




F(n) = 1, если n = 0 или n = 1 и

F(n) = F(n – 1) + F(n – 2), если n>1

Вычисление n-го ряда Фибоначчи

Fibproc; BX = F(n), AL = n

Cmp AL, 1

jam1; если n > 1, m1

; не рекурсивная ветвь

movBX, 1; если n< 1 или n = 1 BX = F(n) = 1

Ret

; рекурсивная ветвь

m1: pushAX ;

dec AL; AL = n - 1

call Fib; BX = F(n-1)

pushBX; сохранить в стеке F(n-1)

dec AL; AL = n - 2

call Fib; BX = F(n – 2)

pop AX; AX = F(n – 1)

add BX,AX ; BX = F(n – 2) + F(n – 1)

pop AX; восстановить AX

Ret

Fib endp

Работа со строками:

Строка – это последовательность байтов, слов или двойных слов.

Все команды для работы со строками считают, что строка-источникнаходится по адресу DS:SI (DS:ESI), а строка приемник – по адресу ES:DI (ES:EDI).

Все команды работают с одним элементом строки: одним байтом, одним словом или одним двойным словом в зависимости от команды и /или от типа операндов.

Чтобы выполнить действие над всей строкой, слева от команды записывается специальный префикс.

Префикс – это команда повторения операции. Префикс действует только на команды работы со строками, поставленный рядом с любой другой командой он никак не влияет на ее выполнение.

Существуют следующие префиксы:

- rep – повторять

- repe – повторять пока равно

- repz – повторять пока ноль

- repne – повторять пока не равно

- repnz – повторять пока не ноль

1) Префикс повторять rep<строковая команда> заставляет повторяться указанную команду n раз, где n - содержимое регистра CX (ECX). Если (CX) = 0, то команда не выполнится ни разу.

2)repe<стр. команда> = repz<стр. команда>

Указанная строковая команда будет повторяться до тех пор пока флаг ZF = 1, но не более n раз, где n = (CX) или (ECX). Работу команды с этими префиксами можно на псевдокоде описать так:

m: if (CX) = 0 then goto m1;

(CX) = (CX) – 1;

<стркоманда>;

if ZF = 1 then goto m

m1: -------------------------

3) repne<стр команда> = repnz<стр команда>

Указанная строковая команда повторяется до тех пор, пока флаг ZF = 0, но не более n раз, где n – содержимое счетчика CX (ECX).

семантика этих префиксов на псевдокоде:

m: if (CX) = 0 then goto m1;

(CX) = (CX) – 1;

<стркоманда>;

if ZF = 0 then goto m;

m1: ---------------------------

Префикс rep используется обычно с командами: movs, lods, stos, ins и outs

Префиксыrepe, repz, repne, repnzскомандамиcmpsиscas.

Команды копирования для строк.

1) movsop1, op2 ; источник op2 = DS:SI (DS:ESI), приемник op1 = ES:DI (ES:EDI)

2) movsb ; байт данных из (DS:SI) пересылается в ES:DI

3) movsw ; слово данных из (DS:SI) пересылается в ES:DI

4) movsd ;дв. слово данных из (DS:SI) пересылается в ES:DI

При использовании команды 1) - movs Ассемблер сам определяет по типу указанных в команде операндов сколько байтов данных нужно переслать – 1, 2 или 4.

В этой команде можно изменить DS на другой регистр: ES, GS, FS, CS, SS, но регистр операнда приемника ES изменять нельзя.

Чаще команды для строк используются без операндов.

После выполнения любой команды со строками содержимое регистров SI и DI автоматически изменяется в зависимости от значения флажка DF.

Если DF = 0 , то (SI/ESI) и (DI/EDI) увеличивается на 1 или 2 или 4,

Если DF = 1 , то (SI/ESI) и (DI/EDI) уменьшается на 1 или 2 или 4 в зависимости от операндов или кода команды.

Команды сравнения строк.

1) cmps op1, op2 ;

2) cmpsb ; сравнение байтов

3) cmpsw ; сравнение слов

4) cmpsd ; для i386 и > сравнение двойных слов

По команде 1) в зависимости от типа операндов сравнивается содержимое байтов, слов или дв. слов, расположенных по адресам источника и приемника.

В остальном команды сравнения работают также, как и команды пересылки. Эти команды используются с префиксами

1) repe / repz

2) repne / repnz

 

При использовании префиксов:

1) сравнение идет до первого не совпадения,

2) – до первого совпадения.

Команды:

1) scasop1 ;op1 - приемник

2) scasb ; сравнивает (AL) с байтом из ES:DI / ES:EDI

3) scasw ; сравнивает (AX) со словом из ES:DI / ES:EDI

4) scasd ; для i386 и выше,

; сравнивает (EAX) с двойным словом из ES:DI / ES:EDI

При работе команды

1) количество сравниваемых байтов зависит от разрядности операнда.

Команды cmps и scas устанавливают флаги аналогично командеcmp.

Команды считывания строки из памяти и загрузки в регистр AL, AX или EAX

1) lods op2 ; op2 – источник DS:SI или DS:EDI

2) lodsb ; 1 байтиз DS:SI или DS:EDI AL

3) lodsw ; 2 байтаиз DS:SI или DS:EDI AX

4) lodsd ; 4 байтаиз DS:SI или DS:EDI EAX

lodsop2 работает как lodsb или lodsw или lodsd в зависимости от типа операнда и здесь DS можно заменить на ES, FS, GS, CSSS.

Команды записи строки из регистра AL, AX или EAX в память по адресу ES:DI или ES:EDI.

Stos op1

Stosb

Stosw

4) stosd; для i386 и выше

При использовании этих команд с префиксом rep строка длиной в (CX) (ECX) ячеек заполнится числом, хранящимся в аккумуляторе AL, AX или EAX

Считывание из порта ввода/вывода.

Ins op1, DX

Insb

Insw

4) insd; i386 и >

Эти команды считывают из порта ввода/вывода, номер которого содержится в регистре DX, байт (insb), слово (insw) или двойное слово (insd) и пересылает их в память по адресу ES:DI или ES:EDI. Команда 1) принимает одну из форм 2), 3), 4) в зависимости от типа операнда.

При использовании с префиксом rep она считывает из порта ввода/вывода блок данных (байтов, слов или двойных слов) длинной, определяемой регистром CX (ECX) и пересылает в память по адресу приемника.

Запись в порт в/в содержимого ячейки памяти, размером в байт, слово или дв. слово, находящейся по адресу DS:SI или DS:EDI

1) outs DX, op2

Outsb

Outsw

4) outsd ; i386 и >

Номер порта в командах работы с портами в/в должен находиться в регистре DX.

В команде outs можно заменить DS на ES, FS, GS, CSSS. Используя префикс rep можно переслать в порт блок данных размером в (CX) или (ECX) байтов, слов или двойных слов.



2018-07-06 326 Обсуждений (0)
Пример рекурсивной функции 0.00 из 5.00 0 оценок









Обсуждение в статье: Пример рекурсивной функции

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (326)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)