MZYa_Ekzamen.pptx
- Количество слайдов: 30
Вопрос: 1 Процессор i 8086. Структура, основные регистры и взаимодействие частей в процессе функционирования.
Вопрос: 2. Процессор i 8086. Адресация оперативной памяти i 8086. Сегментная модель 16 -ти разрядной адресации памяти Схема 16 -ти разрядной адресации памяти Исполнительный адрес (смещение в сегменте) Индекс SI, DI База Непосред. смещение BX, BP Disp Схема адресация «база +смещение» : Aф = Aб + Асм 0 Сегментный адрес (16) Сегментный регистр Сегментный SS регистр ES DS CS 3 4 5 6 7 … Смещение Добавляются Сегментная схема адресации микропроцессора i 8086: аппаратно ОП Исполнительный адрес (16) Блок преобразования адресов 2 Адрес базы + Указатель (32) 1 16 -разрядный сегментный адрес 0000 16 -разрядное смещение в сегменте Физический адрес (20) 20 -ти разрядный физический адрес 1 Мб Сегмент при 16 -ти разрядной адресации – фрагмент памяти 2 размером не более 64 кбайт, который начинается с адреса, кратного 16. Адресация сегментов различных типов Программа размещается в сегментах трех типов, каждый из которых адресуется одним из сегментных регистров и регистром или регистрами, содержащими смещение. Сегментный Смещение 1. Сегмент кода: CS: IP адрес в сегменте 2. Сегмент стека: SS: SP 3. Основной и дополнительный сегменты данных: BX + DI + <Непосредственное смещение> BX + SI + <Непосредственное смещение> BP + DI + <Непосредственное смещение> DS: BP + SI + <Непосредственное смещение> ES: BX + <Непосредственное смещение> BP + <Непосредственное смещение> Сегм. База SI + <Непосредственное смещение> DI + <Непосредственное смещение> Индекс Сегм. 2
Вопрос: 3. Процессор i 8086. Структура машинной команды. Система машинных команд i 8086. Форматы команды MOV Префиксы Код операции 1 байт адресации 2 байта смещения 2 байта данных Рег-р/память регистр 100010 DW Mod Reg R/M Смещение млад. байт 1100011 W Смещение стар. байт Примеры: 1) mov BX, CX Смещение стар. байт Литерал рег-р/память Mod 000 R/M D - 1 - в регистр, 0 - из регистра W - 1 - операнды-слова, 0 - байты W=1 Reg 000 AX 001 CX 010 DX 011 BX 100 SP 101 BP 110 SI 111 DI W=0 000 AL 001 CL 010 DL 011 BL 100 AH 101 CH 110 DH 111 BH Sr 00 01 10 11 Смещение млад. байт Данные Mod - 00 – смещение Disp=0 байт 01 – смещение Disp=1 байт 10 – смещение Disp=2 байта 11 – операнды-регистры ES CS SS DS M = 000 001 010 011 100 101 110 111 Примеры машинных команд EA=(BX)+(SI)+Disp EA=(BX)+(DI)+Disp EA=(BP)+(SI)+Disp EA=(BP)+(DI)+Disp EA=(SI) + Disp EA=(DI) + Disp EA=(BP) + Disp * 3 EA=(BX) + Disp 89 CB 100010 DW Mod Reg 10001001 11 001 011 2) mov CX, 6[BX] 8 B 4 F 06 100010 DW Mod Reg Mem См. мл. байт 10001011 01 001 111 00000110 3) mov byte ptr 6[BX], 10 C 6 47 06 0 A 1100011 W Mod 000 Mem См. мл. байт Данные 11000110 01 000 111 00000110 00001010 3
Вопрос: 4. Процессор IA-32. Программная модель. 1. 3 Программная модель процессоров IA-32 Процессоры IA-32 могут функционировать в одном из трех режимов: реальной адресации (Real address mode) – процессор работает как процессор i 8086, адресует только 1 Мб памяти, с использованием 32 -х разрядных расширений, например, 32 -х разрядных регистров или команд перехода в защищенный режим; защищенном (Protected mode) – процессор работает с 32 -х разрядными адресами и при этом использует сегментную и, как правило, страничную модели памяти; управления системой (System Management mode) – для выполнения действий с возможностью их полной изоляции от прикладного программного обеспечения и операционной системы. Переход в ре-жим возможен только аппаратно. используется для выполнения таких операции, как переход в энергосберегающее состояние. Кроме этого раньше использовался режим виртуальной адресации, когда выполняется эмуляция нескольких «одновременно» работающих i 8086. 4
Вопрос: 5. Процессор IA-32. Режимы адресации оперативной памяти. Плоская модель памяти Flat Модель памяти Flat используется в приложениях Windows: база = 0; граница совпадает с объемом доступной оперативной памяти; сегмент кода, сегмент данных и сегмент стека располагаются в одном и том же пространстве адресов, которое разделено между указанными сегментами. Начальные адреса памяти отводятся для размещения операционной системы. В связи с этим все модули компонуются не с начальных адресов, а с базового адреса в сегменте - 0 x 400000. в PE формате, несмотря на то, что сам формат позволяет выравнивать секции на 512 байт, используется выравнивание секций на границу 4 кб, меньшее выравнивание в Windows не считается корректным. Адресное пространство приложения Схема 32 -х разрядной адресации Эффективный адрес Страницы по 4 Кб Индекс База Непосредственное смещение x + Индекс сегмента (14) Эффективный адрес (32) Блок разбивки Блок сегментации Линейный на страницы адрес (32) Физический Селектор 2 0 адрес (32) (Сегментный регистр) Базовые адреса ОП 0 Селектор Таблица глобальных Селектор дескрипторов Windows Сегмент стека Сегмент данных Сегмент кода Физическое адресное пространство 5 5 4 Кбайта 4 Кбайта 4 Кбайта Поскольку аналогично адресуются все приложения, защита сегментов не работает (нельзя писать в сегмент кода, но можно в сегмент данных, расположенный в том же пространстве). Работает только защита страниц. сегментов Селектор Таблица локальных Селектор дескрипторов Линейное адресное пространство 4 Кбайта Масштаб Виртуальный адрес (46) Страничная организация памяти Линейное пространство отображается в физическое пространство посредством специальной таблицы, отдельной для каждого приложения 5
Вопрос: 6. Процессор IA-32. Структура машинной команды. Байты изменения длины операнда и адреса. Система команд семейства процессоров IA-32 Регистровые команды Размер команды от 1 до 15 байт: W=1 000 001 010 011 100 101 110 111 EAX ECX EDX EBX ESP EBP ESI EDI W=0 000 AL 001 CL 010 DL 011 BL 100 AH 101 CH 110 DH 111 BH Примеры: 1) mov EBX, ECX d – направление: 1 – в регистр, 0 – из регистра; w – 1 – операнды - двойные слова, 0 – байты; mod - 00 - Disp=0 – смещение в команде 0 байт; 01 - Disp=1 – смещение в команде 1 байт; 10 - Disp=2 – смещение в команде 4 байта; 11 - операнды-регистры. Sib присутствует, если: • операнд находится в памяти; • поле m = 100. 6 89 CB В режиме use 32 префикс 66 h определяет 16 -ти разрядный операнд 100010 DW Mod Reg 10001001 11 001 011 66 2)mov 89 CB BX, CX префикс1 100010 DW Mod Reg 0110 10001001 11 001 011 6
Вопрос: 7. Структура программы на Masm 32. Директивы объявления 2. 3 Директивы объявления данных. 2. 2 Структура программы на языке ассемблера Упрощенные директивы сегментации • . MODEL <Модель>[Модиф. ][, <Язык>][, <Модификатор языка>] где – <Модель> – определяет набор и типы сегментов: • 32 -х разрядная адр. : FLAT ; – <Модификатор> – определяет тип адресации: use 16, use 32, dos – <Язык>и <Модификатор языка>– определяют особенности передачи параметров при использовании разноязыковых модулей: • • • С, PASCAL, BASIC, FORTRAN, SYSCALL, STDCALL; . CODE [<Имя сегмента>] – начало или продолжение сегмента кода; . STACK [<Размер>] – начало или продолжение сегмента стека; . DATA – начало или продолжение сегмента инициализированных данных; . DATA? – начало или продолжение сегмента неинициализированных данных; . CONST – начало или продолжение сегмента неизменяемых данных 7 Программа на ассемблере для Win 32 состоит из нескольких сегментов следующих типов: • сегмент кода, содержащий команды ассемблера; • сегменты данных: сегмент констант, содержащий директивы объявления данных, изменение которых не предполагается; сегмент инициализированных данных, содержащий директивы объявление данных, для которых заданы начальные значения – память под эти данные распределяется во время ассемблирования программы; сегмент неинициализированных данных, содержащий директивы объявление данных – память под эти данные отводится во время загрузки программы на выполнение; • сегмент стека, определяемый для ассемблера Win 32 по умолчанию. Сегменты описываются полными или сокращенными директивами 7 [<Имя>] <Директива>[<Число>DUP(]<Инициализатор[, Инициализатор] …>[)] Директива Описание типа данных BYTE SBYTE WORD SWORD DWORD SDWORD FWORD QWORD TBYTE REAL 4 REAL 8 REAL 10 8 -разрядное целое без знака 8 -разрядное целое со знаком 16 -разрядное целое без знака или ближний указатель RM 16 -разрядное целое со знаком 32 -разрядное целое без знака или ближний указатель PM 32 -разрядное целое со знаком 48 -разрядное целое или дальний указатель PM 64 -разрядное целое 80 -разрядное целое 32 -разрядное короткое вещественное 64 -разрядное длинное вещественное 80 -разрядное расширенное вещественное Примечание: Также могут использоваться директивы DB, DW, DD, DQ, DT, но в этом случае знаковые и беззнаковые, целые и вещественные типы 7 транслятор не различает.
Вопрос: 8. Процедуры. Директивы описания процедур. 3. 1 Организация передачи управления в процедуру и обратно Описание процедуры В отличие от языков высокого уровня, ассемблер не требует специального оформления процедур. На любой адрес программы можно передать управление командой вызова процедуры, и оно вернется к вызвавшей процедуре, как только встретится команда возврата управления. Такая организация может привести к трудночитаемым программам, поэтому в язык Ассемблера включены директивы логического оформления процедур. Для описания процедуры используются специальные директивы начала и завершения. В минимальной форме (при опущенных операндах) они выглядят так: <Имя процедуры> PROC <Тело процедуры> <Имя процедуры> ENDP 8 Процедура в ассемблере – это относительно самостоятельный фрагмент, к которому возможно обращение из разных мест программы. На языках высокого уровня такие фрагменты оформляют соответствующим образом и называют подпрограммами: функциями или процедурами в зависимости от способа возврата результата. Поддержка модульного принципа для ассемблера означает, что в языке существуют специальные машинные команды вызова подпрограммы и обратной передачи управления. Кроме машинных команд в языке существует набор макрокоманд и директив, упрощающий работу с процедурами. 8 Команды вызова процедуры и возврата управления 1. Команда вызова процедуры: CALL rel 32/r 32/m 32 ; вызов внутрисегментной ; процедуры (near - ближний ) CALL sreg: r 32/m 48 ; вызов межсегментной процедуры ; (far - дальний ) 2. Команда возврата управления: RET [<Целое>] где <Целое> – количество байт, извлекаемых из стека при возврате управления – используется для удаления из стека параметров процедуры (см. далее). При выполнении команды вызова процедуры автоматически в стек заносится адрес команды, следующей за командой вызова процедуры, – адрес возврата. Команда возврата управления выбирает этот адрес из стека и осуществляет переход по нему. 8
Вопрос: 9. Способы передачи параметров в процедуру. 3. 2. 5 Передача параметров через стек 3. 2 Передача данных в подпрограмму 3. 2. 2 Процедуры с глобальными переменными (совместная трансляция) Исходный модуль Основная программа Процедура <Имя> PROC CALL <Имя> RET <Имя> ENDP A B D Данные могут быть переданы в подпрограмму: При совместной трансляции, когда основная программа и процедура объединены в один исходный модуль, ассемблер строит общую таблицу символических имен. Следовательно, и основная программа и процедура могут обращаться к символическим именам, объявленным в том же модуле. Способ не технологичен: • процедуры не универсальны; • большое количество ошибок. • через регистры – перед вызовом процедуры параметры или их адреса загружаются в регистры, также в регистрах возвращаются результаты; • напрямую – с использованием механизма глобальных переменных: – при совместной трансляции, – при раздельной трансляции; • через таблицу адресов – в программе создается таблица, содержащая адреса параметров, и адрес этой таблице передается в процедуру через регистр; • через стек – перед вызовом процедуры параметры или их адреса заносятся в стек, после завершения процедуры они из стека удаляются. Основная программа Процедура <Имя> PROC CALL <Имя> A B RET <Имя> ENDP D EBP=ESP EBP Aд. возв +8 A +12 B +16 @D Стек 9 9 9
Вопрос: 10. Процедуры вводавывода консольного режима. Преобразования ввода-вывода. 3. 4 Функции ввода-вывода консольного режима (MASM 32. lib) Функции преобразования данных 1. Функция преобразования завершающейся нулем строки в число: atol proc lp. Src: DWORD ; результат – в EAX 2. Функция преобразования строки (зав. нулем) в беззнаковое число: ustr 2 dw proc psz. String: DWORD ; результат – в EAX 3. Функция преобразования строки в число: atodw proc uses edi esi, String: PTR BYTE ; результат – в EAX 4. Процедура преобразования числа в строку (16 байт): ltoa proc l. Value: DWORD, lp. Buffer: DWORD 5. Процедура преобразования числа в строку: dwtoa proc public uses esi edi, dw. Value: DWORD, lp. Buffer: PTR BYTE 6. Процедура преобразования беззнакового числа в строку: udw 2 str proc dw. Number: DWORD, psz. String: DWORD 10 Библиотека MASM 32. lib содержит специальные функции ввода вывода консольного режима: 1. Процедура ввода в консольном режиме: Std. In PROC lpsz. Buffer: DWORD, ; буфер ввода b. Len: DWORD ; размер буфера ввода до 128 байт 2. Процедура удаления символов конца строки при вводе: Strip. LF PROC string: DWORD ; буфер ввода 3. Процедура вывода завершающейся нулем строки в окно консоли: Std. Out PROC lpsz. Text: DWORD ; буфер вывода, зав. нулем 4. Функция позиционирования курсора: locate PROC x: DWORD, y: DWORD ; местоположение курсора, (0, 0) – левый верхний угол 5. Процедура очистки окна консоли: Clear. Screen PROC 10
Вопрос: 11. Организация многомодульных программ на Masm 32. Директивы. 3. 3 Директивы описания процедур 1. Директива заголовка процедуры: <Имя процедуры> PROC [<Тип вызова>] [<Конвенция о связи>] [<Доступность>] [USES <Список используемых регистров>] [, <Параметр> [: <Тип>]]. . . Тип вызова: far – межсегментный; near – внутрисегментный (используется по умолчанию). Конвенция о связи (по умолчанию используется указанная в. MODEL): STDCALL – стандартные Windows; C – принятые в языке С, PASCAL – принятые в языке Pascal и др. Доступность – видимость процедуры из других модулей: public – общедоступная (используется по умолчанию); private – внутренняя; export – межсегментная и общедоступная. 11 Список используемых регистров – содержит регистры, используемые в процедуре, для их автоматического сохранения и восстановления. Параметр – имя параметра процедуры. Тип – тип параметра или VARARG. Если тип не указан, то по умолчанию для 32 -х разрядной адресации берется DWORD. Если указано VARARG, то вместо одного аргумента разрешается использовать список аргументов через запятую. Пример: ABC PROC NEAR STDCALL PUBLIC USES EAX, X: DWORD, Y: BYTE, H: DWORD PTR
Вопрос: 12. Проблемы связи разноязыковых модулей. Конвенции о связях WINDOW’s (3) Конвенции о связях WINDOW’s (2) 3. 6 Связь разноязыковых модулей • тип вызова: NEAR; • модель памяти: FLAT; • пролог и эпилог – стандартные, текст зависит от конвенции и наличия локальных переменных: Конвенции о связях WINDOW’s Конвенции о связи определяют правила передачи параметров. Основные проблемы связи разноязыковых модулей: № Название в MASM 32 • осуществление совместной компоновки модулей; • организация передачи и возврата управления; Delphi Pascal C++Builder Visual C++ • передача параметров: 1 PASCAL – с использованием глобальных переменных, – с использованием стека (по значению и по ссылке), 2 С • обеспечение возврата результата функции; • обеспечение корректного использования регистров процессора. pascal cdecl _ _ pascal - Порядок записи пар-ров в стек прямой Удале- Испольние пар зование -ров из регистстека ров процедура - _ _ cdecl обратный осн. прогр. - _ _ stdcall 3 STDCALL stdcall _ _ stdcall обратный процедура - 4 register _ _ fastcall обратный процедура до 3 -х (VC – до 2 -х) обратный процедура 12 5 12 - - safecall - - • особенности компиляции и компоновки: C++ Builder Visual C++ push. EBP mov EBP, ESP sub ESP, <Размер памяти локальных переменных>] – эпилог: mov ESP, EBP pop EBP ret [<Размер области параметров>] Преобразует все строчные буквы имен в прописные Различает прописные и строчные буквы в именах Не изменяет внешних имен Помещает «_» перед внешними именами Внутреннее имя совпадает с внешним – пролог: [ Delphi @<имя>$q<описание параметров> @<имя> @ <количество параметров * 4> • можно не сохранять регистры: EAX, EDX, ECX. • необходимо сохранять регистры: EBX, EBP, ESI, EDI. 12 12
Вопрос: 13. Конвенции Windows. Связь Delphi Pascal – Masm 32. 3. 6. 1 Delphi PASCAL – MASM 32 Конвенции о связях WINDOW’s Конвенции о связи определяют правила передачи параметров. № Название в MASM 32 1 PASCAL 2 С 5 pascal cdecl 3 STDCALL 4 Delphi Pascal - - stdcall C++Builder _ _ pascal _ _ cdecl _ _ stdcall Visual C++ _ _ cdecl _ _ stdcall register _ _ fastcall safecall - - Порядок записи пар-ров в стек прямой Удале- Испольние пар зование -ров из регистстека ров процедура осн. прогр. - обратный процедура до 3 -х (VC – до 2 -х) обратный процедура 13 • совместимость часто используемых данных: • модуль ассемблера предварительно ассемблируется и подключается с использованием директивы обычно – в секции реализации модуля Delphi Pascal: Описание в Delphi: Implementation {$l <Конвенция>. obj} // Имя файла совпадает с конвенцией procedure ADD 1 (A, B: integer; Var C: integer); <Конвенция>; external; массив – располагается в памяти по строкам, - обратный Пример 3. 7 Delphi PASCAL – MASM 32 Integer, Pointer – 4 байта, procedure ADD 1 (A, B: integer; Var C: integer); pascal; external; - обратный • в модуле на Delphi Pascal процедуры и функции, реализованные на ассемблере, должны быть объявлены и описаны как внешние external с указанием конвенции связи, например: Delphi PASCAL – MASM 32 Вызов процедуры: ADD 1(A, B, C); строка (shortstring) – содержит байт длины и далее символы; Указание Для ассемблирования установить в настройках проекта Rad. ASM: 3, O, $BML. EXE /c, 2 или добавить в Turbo Delphi инструмент (меню Tools/Configure tools/Add), назначив в качестве инструмента программу-ассемблер ml. exe: Title: Masm 32 - название; Program: C: masm 32binml. exe - путь и ассемблер; Working Dir: - пусто (текущий каталог); Parameters: /c /Fl $EDNAME - текущий файл редактора среды, ассемблирование и листинг Word – 2 байта, Byte, Char, Boolean – 1 байт, • параметры передаются через стек: – по значению – в стеке копия значения, – по ссылке – в стеке указатель на параметр; {$l <Имя объектного модуля>} • результаты функций возвращаются через регистры: – байт, слово – в AX, – двойное слово, указатель – в EAX, 13 – строка – через указатель, помещенный в стек после параметров. 13 13
Вопрос: 14. Конвенции Windows. Связь Visual С++ - Masm 32. 3. 6. 3 Visual С++ – MASM 32 Конвенции о связях WINDOW’s • в модуле на Visual C++ подключаемые процедуры и функции должны быть объявлены как внешние extern с указанием конвенции связи, например: Конвенции о связи определяют правила передачи параметров. № Название в MASM 32 Delphi Pascal 1 PASCAL pascal _ _ pascal 2 С cdecl _ _ stdcall C++Builder Visual C++ - Порядок записи пар-ров в стек Удале- Испольние пар зование -ров из регистстека ров прямой процедура - _ _ cdecl обратный осн. прогр. - 3 STDCALL stdcall _ _ stdcall обратный процедура - 4 register _ _ fastcall обратный процедура до 3 -х (VC – до 2 -х) 5 - - safecall - - обратный процедура 14 extern void __pascal add 1(int a, int b, int *c); • при ассемблировании должны быть использованы опции: – для Masm 32: ml /coff /c add 1. asm – для Tasm 5. 0: tasm 32 /ml add 1. asm если ассемблирование выполняется в Visual Studio, то необходимо добавить внешний инструмент ToolsExternal Tools…Add: Title: Masm 32 Command: C: masm 32binml. exe Arguments: /coff /c /Fl $(Item. Path) Initial directory: $(Item. Dir) • файл с расширением. obj необходимо подключить к проекту посредством пункта меню Project/Add existing item… • вызов процедуры должен оформляться по правилам С++, например: add 1(a, b, &c); 14
Вопрос: 15. Типы компилирующих программ и их особенности. 4. 1 Основные понятия 4. 1. 1 Классификация компилирующих программ Транслятор – программа, которая переводит програм-му, написанную на одном языке, в эквивалентную ей программу, написанную на другом языке. Компилятор – транслятор с языка высокого уровня на машинный язык или язык ассемблера. Ассемблер – транслятор с языка Ассемблера на ма-шинный язык. Интерпретатор – программа, которая принимает исходную программу и выполняет ее, не создавая программы на другом языке. Макрогенератор (для компиляторов – препроцессор) – программа, которая обрабатывает исходную про-грамму, как текст, и выполняет в нем замены ука-занных символов на подстроки. Макрогенератор обрабатывает программу до трансляции. 15
Вопрос: 16. Структура компилирующей программы. Основные фазы процесса. Структура процесса компиляции 4. 1. 2 Структура компилирующей программы Синтаксис – это совокупность правил, определяющих допустимые конструкции языка, т. е. его форму. Семантика – это совокупность правил, определяющих логическое соответствие между элементами и значением синтаксически корректных предложений, т. е. содержание языка. Лексический анализ Синтаксический анализ Семантический анализ Распределение памяти Генерация и оптимизация объектного кода 16 16
Вопрос: 17. Синтаксис и семантика языка программирования. Средства описания синтаксиса. Форма Бэкуса-Наура (БНФ) Условные обозначения: 4. 1. 2 Структура компилирующей программы Синтаксис – это совокупность правил, определяющих допустимые конструкции языка, т. е. его форму. <Имя> – нетерминальный символ – конструкция; Имя – терминальный символ – символ алфавита; : : = – «можно заменить на» ; | – «или» Пример: Семантика – это совокупность правил, определяющих логическое соответствие между элементами и значением синтаксически корректных предложений, т. е. содержание языка. <целое> : : = <знак><целое без знака>|<целое без знака> : : = <цифра><целое без знака>|<цифра> <цифра > : : = 0|1|2|3|4|5|6|7|8|9 <знак> : : = +| - 17 17
Вопрос: 18. Синтаксические диаграммы и особенности их построения. Синтаксические диаграммы выражения Объединенная синтаксическая диаграмма Пример. Синтаксический анализатор выражений. = {<Ид>, +, –, *, /, (, ), ◄, ►}. Например: A * (B + C) + (D + F) / (A + B) - C * D 18 18
Вопрос: 19. Формальный язык и формальная грамматика языка. 4. 2 Формальные грамматики и распознаватели 4. 2. 1 Формальный язык и формальная грамматика Алфавит – непустое конечное множество символов, используе-мых для записи предложений языка. Пример: A = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -} Строка – любая последовательность символов алфавита. A* - множество строк, включая пустую, составленных из А. A+ - множество строк за исключением пустой, составленных из А. A* = A+ e Формальным языком L в алфавите A называют произвольное подмножество множества A*. Язык можно задать перечислением и правилами продукции. 19 Формальная грамматика G = (VT, VN, P, S), где VT – алфавит языка или множество терминальных (окончательных, незаменяемых) символов; VN – множество нетерминальных (заменяемых) символов – вспомогательный алфавит, символы которого обозна-чают допустимые понятия языка, VT VN = ; V = VT VN – словарь грамматики; P – множество порождающих правил – каждое правило состоит из пары строк (α, β), где α V+ – левая часть правила, β V* – правая часть правила: α β, где строка α должна содержать хотя бы один нетерминал; S VN – начальный символ – аксиома грамматики. 19
Вопрос: 20. Классификация грамматик Хомского. 4. 2. 3 Классификация грамматик Хомского Тип 0 – грамматики фразовой структуры или грамматики «без ограничений» : α β, где α V+, β V*– в таких грамматиках допустимо наличие любых правил вывода, что свойственно грамматикам естественных языков; Тип 1 – контекстно-зависимые (неукорачивающие) грамматики: α β, где α V+, β V*, | α | | β | – в этих грамматиках для правил вида α X β α x β возможность подстановки строки х вместо символа X определяется присутствием подстрок α и β, т. е. контекста, что также свойственно грамматикам естественных языков; Тип 2 – контекстно-свободные грамматики: A β, где A VN, β V* – поскольку в левой части правила стоит нетерминал, подстановки не зависят от контекста; Тип 3 – регулярные грамматики: A α, A αB, где A, В VN, α VT. 20
Вопрос: 21. Грамматический разбор. Метод «слева направо» . Ограничения и недостатки. 2. Левосторонний восходящий грамматический разбор Пример. Разобрать строку «-45» , используя правила: <целое> : : = <знак><целое без знака>|<целое без знака>, <целое без знака> : : = <целое без знака><цифра>|<цифра>, <цифра > : : = 0|1|2|3|4|5|6|7|8|9, Левосторонняя рекурсия <знак> : : = +| -. Последовательность получения сентенциальных форм при разборе: -45 <целое> : : = <знак><ЦБЗ>|< ЦБЗ >, <знак> 45 <ЦБЗ> : : = <ЦБЗ><цифра>|<цифра>, <знак> <цифра>5 <цифра > : : = 0|1|2|3|4|5|6|7|8|9, <знак> <цбз>5 <знак> : : = +| Тупик! <целое> 5 <знак> <цбз>5 <знак><целое> 5 Тупик! <знак> <цбз>5 <знак> <цбз><цифра> <целое> <цифра> Тупик! Возвраты возникают из-за неверного <знак> <цбз><цифра> выбора основы <знак> <целое> <цифра> Тупик! <знак> <цбз><цифра> <знак> <цбз> <целое> Идея метода: При разборе запись просматривается слева направо и ищется часть, совпадающая с правой частью правила, – основа. Основа – последовательность символов, сворачиваемая на следующем шаге разбора. Найденная основа заменяется левой частью соответствующего правила и т. д. Последовательность выбора основ определена алгоритмом. Неверный выбор основы приводит к необходимости возврата. 21 21
Вопрос: 22. Грамматический разбор. Метод «сверху вниз» . Ограничения и недостатки. 1. Левосторонний нисходящий грамматический разбор Таблица грамматического разбора Черными стрелками показаны смены правил на альтернативные Пример. Разобрать строку «-45» по правилам грамматики: 1) <целое> : : = <знак><целое без знака>|<целое без знака> 2) <целое без знака> : : = <цифра><целое без знака>|<цифра>, 3) <цифра > : : = 0|1|2|3|4|5|6|7|8|9, Правосторонняя 4) <знак> : : = +| -. рекурсия Альтернативные правила нумеруем буквами а, б, в. . . Идея разбора: Если первый символ правила – терминальный, т. е. символ алфавита, и он совпадает с первым символом распознаваемой строки, то символ считается распознанным и удаляется из стека и строки. Если терминалы не совпадают, то ищем альтернативу ближайшему правилу и производим его замену. Если первый символ правила в стеке – нетерминал, то заменяем его на первое из правил, его определяющих. И так далее… 22 Красные стрелки показывают возвраты, требующие сменить правило предыдущих уровней, что требует сохранения истории разбора Возвраты вызваны неправильным выбором альтернатив правил 22
Вопрос: 23. Конечные автоматы и способы их описания. Программная реализация конечного автомата 4. 2. 4 Распознавание регулярных грамматик 4. 2. 4. 1 Конечный автомат M = (Q, , δ, q 0, F), где Q – конечное множество состояний; – конечное множество входных символов; δ(qi, сk) – функция переходов (qi – текущее состояние, сk – очередной символ); q 0 – начальное состояние; F = {qj} – подмножество допускающих состояний. Таблица переходов Пример. Автомат «Чет-нечет» : 0 1 Чет Нечет Q = {Чет, Нечет}; Нечет Чет = {0, 1}; δ(Чет, 0) = Чет, δ(Нечет, 0) = Нечет, Синтаксическая диаграмма δ(Чет, 1) = Нечет, δ(Нечет, 1) = Чет; 0 Граф переходов q 0 = Чет; 1 1 1 0 Чет Нечет 0 F = {Чет} 0 1 23 0 Чет Нечет 1 Символы заверш. Другие символы Чет Нечет Конец Ошибка Нечет Чет Ошибка Ind : = 1 q : = q 0 Цикл-пока q «Ошибка» и q «Конец» q = Table [q, S[Ind]] Ind : = Ind +1 Все-цикл Если q = «Конец» то «Строка принята» иначе «Строка отвергнута» Все-если 23
Вопрос: 24. Конечные автоматы. Построение лексических анализаторов. 4. 2 Лексические анализаторы Пример. Распознаватель целых чисел. Состояние Знак Цифра Разделитель Другие 1 2, А 1 3, А 2 E, D 1 E, D 4 2 Е, D 2 3, А 2 E, D 3 E, D 4 3 K, A 3 3, А 2 K, A 3 E, D 4 A 0: Инициализация: Целое : = 0; Знак_числа : = «+» . А 1: Знак_числа : = Знак А 2: Целое : = Целое*10 + Цифра А 3: Если Знак_числа = «-» то Целое : = -Целое Все-если Д 1: «Строка не является числом» ; Д 2: «Два знака рядом» ; Д 3: «В строке отсутствуют цифры» , Д 4: «В строке встречаются недопустимые символы» 24
Вопрос: 25. Конечные автоматы. Построение синтаксических анализаторов. 4. 2. 4. 3 Синтаксические анализаторы Пример. Синтаксический анализатор списка описания целых скаляров, массивов и функций, например: int xaf, y 22[5], zrr[2][4], re[N], fun(), *g; int V, V[N][N], V(), *V; Обозначения: V – идентификатор; N – целочисленная константа; служебные символы: «[ ] ( ) , ; *» . 1 2 3 4 5 6 7 8 V 3 3 E E E N E E E 7 E E * 2 E E E E ( E E 4 E E E ) E E E 5 E E [ E E 6 ] E E E 8 E , E E 1 ; E E К Другие E E E E 25
Вопрос: 26. Автоматы с магазинной памятью. Построение анализаторов для разбора предложений языка. Синтаксические диаграммы выражения 4. 2. 5 Распознавание КС-грамматик 4. 2. 5. 1 Автомат с магазинной памятью PM = (Q, , Г, , q 0, z 0, F), где Q – конечное множество состояний автомата; – конечный входной алфавит; Г – конечное множество магазинных символов; (q, ck, zj) – функция переходов; q 0 Q – начальное состояние автомата; z 0 Г – символ, находящийся в магазине в начальный момент, F Q – множество заключительных (допускающих) состояний. Объединенная синтаксическая диаграмма Таблица переходов автомата Пример. Синтаксический анализатор выражений. = {<Ид>, +, –, *, /, (, ), ◄, ►}. Например: A * (B + C) + (D + F) / (A + B) - C * D 26 26
Вопрос: 27. LL(k) грамматики. Метод рекурсивного спуска. Синтаксические анализаторы LL(k) грамматик (2) Метод рекурсивного спуска Пример. Дана грамматика записи выражений: 1) <Строка> : : = <Выр>◄ 2) <Выр> : : = <Терм> <Слож> 3) <Слож> : : = e | + <Терм> <Слож> | - <Терм><Слож> 4) <Терм> : : = <Множ><Умн> 5) <Умн> : : = e | *<Множ><Умн> | / <Множ><Умн> 6) <Множ> : : = <Ид> | (<Выр>) Алгоритм распознавателя (2) Алгоритм распознавателя Функция Выражение: Boolean: R: =Терм() Цикл-пока R=true и (Next. Symbol =’+’ или Next. Symbol =’-’) R: =Терм() Все-цикл Выражение: = R Все Функция Терм: Boolean: Множ() Цикл-пока R=true и (Next. Symbol =’*’ или Next. Symbol =’/’) R: =Множ() Все-цикл Терм: = R Все Пример. Выражение Функция Множ: Boolean: Если Next. Symbol =’(’ то R: =Выражение() Если Next. Symbol ‘)’ то Ошибка Все-если иначе R: = Ид() Все-если Все Основная программа: R: =Выражение() Если Next. Symbol ‘◄’ то Ошибка () Все-если Конец 27 27
Вопрос: 28. LR(k) грамматики. Операторное предшествование. Стековый метод. 4. 2. 5. 3 Синтаксические анализаторы LR(k) грамматик. Грамматики предшествования Левосторонний восходящий грамматический разбор : -45 <целое> : : = <знак><ЦБЗ>|< ЦБЗ >, <знак> 45 <ЦБЗ> : : = <ЦБЗ><цифра>|<цифра>, <знак> <цифра>5 <цифра > : : = 0|1|2|3|4|5|6|7|8|9, <знак> <цбз>5 <знак> : : = +| Тупик! <целое> 5 <знак> <цбз>5 Возвраты возникают <знак><целое> 5 Тупик! из-за неверного <знак> <цбз>5 выбора основы <знак> <цбз><цифра> <целое> <цифра> Тупик! <знак> <цбз><цифра> Грамматики LR(k) <знак> <целое> <цифра> обеспечивают Тупик! <знак> <цбз><цифра> однозначный выбор <знак> <цбз> основы <целое> 28 Построение таблицы предшествования Грамматики предшествования . . αβ. . Если два символа α, β V расположены рядом в сентенциальной форме, то между ними возможны следующие отношения, названные отношениями предшествования: 1) α принадлежит основе, а β – нет, т. е. α – конец основы: α > β; 2) β принадлежит основе, а α – нет, т. е. β – начало основы: α < β ; 3) α и β принадлежит одной основе, т. е. α = β; 4) α и β не могут находиться рядом в сентенциальной форме (ошибка). Грамматикой предшествования называется грамматика, в которой из последовательности символов однозначно следует определение основы. Грамматикой операторного предшествования называется грамматика, в которой существует однозначное отношение предшествования терминальных символов, которое не зависит от нетерминальных символов, находящихся между ними. 28 Пример. Грамматика арифметических выражений (с левосторонней рекурсией): Пример разбора выражения стековым методом ►d+c*(a+b) ◄ <Выражение> : : = <Терм>|<Выражение>+<Терм>|<Выражение>- <Терм> : : = <Множитель> | <Терм>* <Множитель> | <Терм> / <Множитель> : : = (<Выражение>) | <Идентификатор> < - начало основы; > - конец основы; = - одна основа; ? - ошибка ►A+ ► A* ►(A ► A) ►A◄ +A+ +A* +(A +A) +A◄ *A+ *A* *(A *A ) *A◄ (A+ (A* ((A (A) (A◄ A)+ A)* A)( A)) A)◄ 28 28
Вопрос: 29. Польская запись. Алгоритм Бауэра -Замельзона. 4. 2. 6 Польская запись. Алгоритм Бауэра. Замельзона Польская запись представляет собой последовательность команд двух типов: КI, где I – идентификатор операнда – выбрать число по имени I и заслать его в стек операндов; K , где – операция – выбрать два верхних числа из стека операндов, произвести над ними операцию и занести результат в стек операндов. Пример: A+B*C KAKBKCK*K+ Пример. Построить тройки для (a+b*c)/d. Алгоритм Бауэра-Замельзона Построение польской записи : а) если символ – операнд, то вырабатывается команда КI, б) если символ – операция, то выполняются действия согласно таблице: Операции: I – заслать в стек операций и читать следующий символ; II – генерировать K , заслать в стек операций и читать следующий символ; III – удалить верхний символ из стека операций и читать следующий символ; IV – генерировать K и повторить с тем же входным символом. 29 29 Построение польской записи: Ka K b K c K * K+ Kd K / или abc*+d/ 29
Вопрос: 30. Способы распределения памяти под переменные. 4. 3 Распределение памяти под переменные § § статическое – выполняется в процессе компиляции или загрузки в память (для сегмента неинициированных данных), используется для хранения глобальных переменных; автоматическое – выполняется при вызове подпрограмм, используется для локальных переменных, размещаемых в стеке; управляемое – выполняется по запросу программиста (new, delete), используется для динамических переменных, размещаемых в динамической памяти; базированное – также выполняется по запросу программиста, но большими фрагментами (getmem, freemem), за размещение переменных отвечает программист. . . 30