assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 55
Текст из файла (страница 55)
Ее синтаксис:.BREAK [ . I F условие]Директива .BREAK позволяет задать дополнительное условие, при выполнениикоторого будет выполнен выход из цикла независимо от условия основного цикла.Директива .CONTINUE передает управление на начало текущего цикла .WHILE или.REPEAT. Ее синтаксис:.CONTINUE [ . I F условие]При необходимости директива .CONTINUE может определять дополнительноеусловие, при соблюдении которого будет выполнен переход на начало текущегоцикла.Особенности пакета MASM245Директивы .CONTINUE и .BREAK могут использоваться только внутри циклов.WHILE или .REPEAT.Комплексный примерЧтобы проиллюстрировать использование директив MASM для имитации конструкций высокого уровня, рассмотрим пример.
Этот пример не является примером«вещи в себе», он призван показать класс задач, которые актуальны при программировании на любом языке. Это задачи контроля информации, поступающей в программу в ходе ее функционирования. Как методически правильно подойти к этомувопросу, не «изобретая каждый раз заново велосипед»? Если вы знакомы с теорией построения трансляторов, то суть проблемы разбора символьных последовательностей и подходы к ее решению для вас не новы. Если же у вас таких знанийнет, то материал данного раздела будет полезен для формирования у вас теоретически грамотного подхода к решению проблемы контроля входных данных вашихпрограмм.Частью любого компилятора является сканер, задача которого — чтение входного потока символов и выделение в нем синтаксически значимых единиц информации. Примером таких единиц могут быть ключевые слова языка, имена переменных, константы и другие синтаксически автономные единицы исходнойпрограммы.
Сканер распознает их и в зависимости от их типа формирует внутреннее представление этих единиц и информацию о них для дальнейшей синтаксической и семантической обработки. Теоретической основой работы сканера является теория автоматов.Немного теории. Конечный автомат представляет собой кортеж М = {К, А, Р, S,F}, где:К — конечное множество состояний;А — конечный входной алфавит;Р — множество переходов;S — начальное состояние;F — множество конечных (последних) состояний.Принципиально сканер функционирует так. Он имеет конечное множество состояний К, одно из которых является начальным S, и несколько конечных F. Перед началом обработки символов очередной лексемы сканер находится в состоянии S.
По мере считывания очередной литеры лексемы состояние сканера меняется.Эти переходы также заранее определены множеством правил перехода Р. Послеокончания чтения лексемы автомат должен оказаться в одном из конечных состояний, некоторые из которых могут соответствовать состоянию ошибки. Исходя изтого, в каком из состояний оказался сканер, он делает вывод о принадлежностилексемы входному языку. Если лексема ошибочная, то компилятором формируется соответствующее диагностическое сообщение, если же лексема корректная, тоона в зависимости от своего типа подвергается дальнейшей обработке.Рассмотрим пример конечного автомата для распознавания целых десятичныхчисел со знаком, считываемых программой с консоли.
Хорошую помощь в построении конечных автоматов оказывают формы Бэкуса-Наура и синтаксические246Глава 11. Программирование типовых управляющих структурдиаграммы. Их мы обсуждали в главе 5. Формы Бэкуса-Наура для построениядесятичных чисел со знаком выглядят так:<десятичное_знаковое_целое>=*<число_6ез_знака>|+<число_без_знака>|<число_без_знака><число_без_знака>=><дес_цифра>|<число_без_знака><дес_цифра><дес_цифра>=>0|1|2|3|4|5|6|7|8|9Графически конечный автомат удобно представлять в виде направленного графа. Конечный автомат для десятичного числа со знаком показан на рис.
11.1.0...9Рис. 11.1. Конечный автомат для десятичного числа со знакомПо рисунку легко закончить формальное определение конечного автомата длядесятичного числа со знаком:" К = {1,2, 3,4};t A -{+,-, 0, 1,2,3,4,5,6,7,8,9};< Р = {1->2, 1->3,1->4, 2->4, 2->3, 3->4, 3->3};Далее приведена программа (листинг 11.1), моделирующая конечный автоматдля распознавания десятичных чисел со знаком.Листинг 11.1. Программа конечного автомата для десятичных чисел со знаком.model smallмодель памятисегмент данных.datamessage db Odh.Oah, I am ready to receive your v a r i a n t of signed decimalnumber (to finish press Enter): $'message_Invalid_Number db 0dh,0ah,'Your input is bed, please input yournumber again or press Enter.
$'good_luck_messagedb Q d h . Q a h , ' Y o u r number is: 'input_stringdb 10 dup (2Qh) ;строка для ввода 9 цифр и знакаdb O d h . O a h , ' T h a n k you for use this program. I wish you good l u c k . . . $ '; сегмент стека.stack 256h.code; сегмент кодаGetNextChar procmov ah,l;чтение символа из стандартного ввода;символ в alint 21hretGetNextChar endpОсобенности пакета MASMmain247procначало процедуры mainmov ax,@dataзаносим адрес сегмента данных в регистр ахmov ds.axах в dsmov ah,9lea dx,messageint 21hвывод сообщения на экранxor si ,siподготовка индексного регистра sicallGetNextChar ввод первого символа в al.if (al=="+" || al=="-" || al>=30h && al<=39h)mov input_string[si],alinc si.elsejmp bed_end.endif.while si<9callGetNextChar ;ввод очередного символа в al.if (al>=30h && al<=39h)mov input_string[sij,alinc si.conti nue.elseif al==0dh.
break.elsejmp bed_end. endif. endwmov ah,9lea dx,good_luck_messageint 21h; вывод сообщения good luck_message на экранjmp exit_progbed_end:mov ah,9lea dx,message_Invalid_Numberint 2Inвывод сообщения message_Invalid_Number на экранexi t_prog:callGetNextChar задержка до ввода любого символаmov ax,4c00hпересыпка 4с00п.в регистр ахint 21hвызов прерывания с номером 21hmainendpконец процедуры m a i nend mainконец программы с точкой входа mainНапомню, что для получения пригодного для отладки исполняемого модуляданной программы необходимо сформировать командную строку видаM L . E X E /Fl /Zi Prg_ll_l.asm >pДля отладки используйте отладчик CodeView:cv.exe Prg_ll_l.asmВ качестве упражнения вы можете потренироваться в программировании конечных автоматов для разбора произвольных символьных строк. После освоенияматериала главы 17 практически полезной может быть программа конечного автомата для разбора чисел с плавающей точкой.
Дополнительный материал по программированию конечных автоматов вы найдете в [8].В заключение данной главы хотелось бы заметить, что приведенные в ней рассуждения о моделировании вариантов типовых циклических конструкций не являются догмой. Их основное назначение — показать возможность и практическуюпользу моделирования циклических конструкций в ассемблерной программе. Важность материала данной главы состоит в том, что использование этих конструкцийв программах способно, наряду с облегчением написания ассемблерного кода, существенно повысить его надежность.248Глава 11. Программирование типовых управляющих структурИтогиII Язык ассемблер не содержит управляющих конструкций, естественных для языков высокого уровня. Это существенно снижает наглядность ассемблерных программ и надежность программирования в целом.• На практике существует настоятельная необходимость поддержки любым языком операторов выбора, различного типа операторов цикла и некоторых других.ж В разных пакетах ассемблера реализованы свои «фирменные» подходы к решению данной проблемы:П TASM имеет два режима работы: MASM и IDEAL.
В режиме MASM всеуправляющие конструкции нужно моделировать. Этот процесс подробноописан в первой части данной главы. В режиме IDEAL есть встроенные средства для организации типовых управляющих конструкций, но из-за прекращения поддержки TASM фирмой Borland работа в режиме IDEAL теряетактуальность;D пакет MASM имеет встроенные средства, моделирующие управляющие конструкции языков высокого уровня. Их использование существенно повышает скорость и надежность разработки программ.« Важно понимать, что встроенные средства, моделирующие управляющие конструкции языков высокого уровня — это лишь надстройка компилятора наднекоторым базовым ассемблерным уровнем. В конечном итоге, все высокоуровневые конструкции будут переведены в последовательность команд ассемблера и исполнены процессором.Глава 12Цепочечные командыСредства процессора для обработки цепочек элементовв памятиОперации пересылки и сравнения цепочекОперации для работы с отдельными элементами цепочекОперации для работы с портами ввода-выводаВ данной главе будет рассмотрена чрезвычайно интересная группа команд, понимание принципов работы которых и их грамотное использование способны значительно облегчить жизнь программисту, пишущему программы на языке ассемблера.