Пример рекурсивной функции
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) байтов, слов или двойных слов.
Популярное: Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (331)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |