assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 27
Текст из файла (страница 27)
Синтаксис ассемблераIII Директивы описания простых типов данных позволяют резервировать и принеобходимости инициализировать области памяти заданной длины.Ш Доступ к данным в памяти должен производиться с учетом принципа их размещения процессорами IA-32 — «младший байт по младшему адресу».ss Каждой переменной, объявленной с помощью директивы описания данных,ассемблер назначает атрибуты, доступ к которым можно получить с помощьюсоответствующих операторов ассемблера.Глава 6Первая программаЖизненный цикл программы на ассемблереПример простой программыРазработка программ на ассемблере с использованиемпакета TASMРазработка программ на ассемблере с использованиемпакета MASMТрансляция и компоновка программыНазначение и структура выходных файлов, формируемыхтрансляторомОтладка программМенеджер проекта — утилита МАКЕВ этой главе мы, во-первых, познакомимся с процессом разработки программ наассемблере, во-вторых, научимся использовать специальные программные средства, предназначенные для преобразования исходных текстов на ассемблере в машинные коды для их исполнения компьютером.Жизненный цикл программыПроцесс разработки программы на ассемблере, включая постановку задачи, получение первых результатов и дальнейшее сопровождение программы, мало чем отличается от традиционного подхода с использованием любого из существующихязыков программирования.
После адаптации основных положений этого процесса к особенностям ассемблера получится вполне стандартный перечень работ.1221.2.Глава 6. Первая программаПостановка и формулировка задачи:П изучение предметной области и сбор материала в проблемно-ориентированном контексте;П определение назначения программы, выработка требований к ней и представление требований, если возможно, в формализованном виде;П формулирование требований к представлению исходных данных и выходных результатов;D определение структур входных и выходных данных;П формирование ограничений и допущений на исходные и выходные данные.Этап проектирования:П формирование «ассемблерной» модели задачи;П выбор метода реализации задачи;П разработка алгоритма реализации задачи;D разработка структуры программы в соответствии с выбранной моделью памяти.3.
Этап кодирования:П уточнение структуры входных и выходных данных и определение ассемблерного формата их представления;П программирование задачи;D комментирование текста и составление предварительного описания программы.4. Этап отладки и тестирования:D составление тестов для проверки работоспособности программы;П обнаружение, локализация и устранение в программе ошибок, выявленныхв тестах;П корректировка кода программы и ее описания.5. Этап эксплуатации и сопровождения:а настройка программы на конкретные условия использования;П обучение пользователей работе с программой;П организация сбора сведений о сбоях в работе программы, ошибках в выходных данных, пожеланиях по улучшению интерфейса и удобства работыс программой;П модификация программы с целью устранения выявленных ошибок и, принеобходимости, изменения ее функциональных возможностей.Порядок и объем работ в приведенном перечне укладываются в понятие жизненного цикла программы на ассемблере.
На практике к порядку применения и иолноте выполнения перечисленных этапов нужно подходить разумно и творчески.Многое определяется особенностями конкретной задачи, ее назначением, объемами кода и обрабатываемых данных, другими характеристиками исходной задачи.Некоторые из этих этапов могут либо выполняться одновременно с другими, либоПример простой программы123вовсе отсутствовать. Главная цель формирования подобного списка работ — в том,чтобы изначально упорядочить процесс создания нового программного продуктас сохранением концептуальной целостности постановки задачи и исключениеманархии в процессе разработки.Пример простой программыВ данном разделе рассмотрим пример простой, но полноценной программы на ассемблере.
В главе 2 при обсуждении архитектуры было перечислено большое количество регистров. Как правило, большинство из них задействовано практическив любой программе. Было бы интересно во время работы программы посмотреть(получить) их содержимое. Это нетрудно, если использовать специальную программу — отладчик. Но как сделать это динамически и автономно (без помощидругих программ)? Или, к примеру, как решить обратную задачу — ввести некоторое значение с клавиатуры в регистр? Эта и подобная ей задачи являются задачами преобразования данных. Они довольно часто возникают на практике. Причиназдесь в том, что компьютер воспринимает данные только тех типов, которые поддерживаются его системой команд. Поэтому на практике часто возникает необходимость преобразования данных из одного представления в другое.
В этой главев качестве примера рассмотрим частный случай решения одной из таких задач —задачи преобразования шестнадцатеричного числа из двух цифр, вводимого с клавиатуры (то есть в символьном виде), в двоичное число. После выполнения этойоперации полученное число можно использовать как операнд в двоичных арифметических операциях.Для начала нужно продумать алгоритм и изучить предметную область. Вводинформации с клавиатуры и вывод ее на экран осуществляются в символьном виде.Кодирование этой информации производится согласно таблице ASCII. В таблицеASCII каждый символ кодируется одним байтом. Если работа происходит с числами, то при попытке их обработать сразу возникает проблема: команд для арифметической обработки чисел в символьном виде нет. Что делать? Выход очевиден:нужно преобразовать символьную информацию в формат, поддерживаемый машинными командами.
После такого преобразования нужно выполнить необходимые вычисления и преобразовать результат обратно в символьный вид. Затем следует отобразить информацию на мониторе.Рассматриваемая в этом разделе программа является одним из вариантов решения задачи. В основу ее алгоритма положена особенность, связанная с ACSIIкодами символов соответствующих шестнадцатеричных цифр.
Шестнадцатеричные цифры формируются из символов 0,1,..., 9, А, В, С, D, E, F, а, Ь, с, d, e, f, например:12Af, 34ad. В таблице ASCII можно найти значения ASCII-кодов, соответствующие этим символам. На первый взгляд, непонятна популярность способа представления информации в виде шестнадцатеричных чисел.
Из предыдущих глав известно, что аппаратура компьютера построена на логических микросхемах и работаеттолько с двоичной информацией. Если нам требуется проанализировать, например,состояние некоторой области памяти, то разобраться в нагромождении нулей и единиц будет очень непросто. Для примера рассмотрим двоичную последовательность010100010101011110101101110101010101000101001010.124Глава 6. Первая программаЭто представление не очень наглядно.
В главе 2 отмечалось, что оперативнаяпамять состоит из ячеек — байтов — по 8 битов. Приведенная выше цепочка битовпри разбиении ее на байты будет выглядеть так:01010001 01010111 10101101 11010101 01010001 01001010.С наглядностью стало лучше, но если исследуемая область памяти окажетсябольше, то разобраться будет все равно сложно. Проведем еще одну операцию: каждый байт разобьем на две части по 4 бита — тетрады:0101 0001 0101 0111 1010 1101 1101 0101 0101 0001 0100 1010.И вот тут проявляется замечательное свойство шестнадцатеричных чисел —каждой тетраде можно поставить в соответствие одну шестнадцатеричную цифру(табл. 6.1).Таблица 6.1. Кодировка шестнадцатеричных цифрШестнадцатеричнаяцифра0123456789А, аВ.ЬС, сD,dЕ,еF,fASCII-код(двоичное представление)ЗОЬ(ООНОООО)31h (ООН 0001)32h (001 10010)33h (001 10011)34h (001 10100)35h (001 10101)36h(00110110)37h (ООН 0111)38h (001 11000)39h(0011 1001)41h (0100 0001), 61h (01 10 0001)42h (0100 0010), 62h (0110 0010)43h (0100 001 1), 63h (01 10 001 1)44h (0100 0100), 64h (0110 0100)45h (0100 0101), 65h (0100 0101)46h (0100 0110), 66h (0110 0110)Двоичнаятетрада000000010010ООП01000101оно011110001001101010111100110111101111Если заменить в последней полученной строке тетрады соответствующимишестнадцатеричными цифрами, то получим последовательность 51 57 ad d5 51 8а.Каждый байт теперь наглядно представлен двумя шестнадцатеричными цифрами, что оказывается очень удобным, в частности, при работе с отладчиком.Вернемся к нашей задаче.
Если посмотреть внимательно на представлениешестнадцатеричных цифр и их кодировку в ACSII-коде (табл. 6.1), то можно увидеть полезные закономерности. К примеру, ASCII-код нуля (код символа 0) в шестнадцатеричном виде равен 30h. В двоичном представлении 30h записывается какПример простой программы1250011 0000, а соответствующее двоичное число должно быть двоичным представлением нуля 0000 0000. Отсюда следуют некоторые выводы.Вывод первый.
Для шестнадцатеричных цифр 0...9 ACSII-код отличается от соответствующего двоичного представления на 0011 0000, или 30h. Поэтому для преобразования кода символа шестнадцатеричной цифры в соответствующее двоичное число есть два пути:ii выполнить двоичное вычитание: (АСЗП-код)п - ЗОН;Ж обнулить старшую тетраду байта, с символом шестнадцатеричной цифрыв ACSII-коде.Видно, что с шестнадцатеричными цифрами в диапазоне от 0 до 9 все просто.Что касается шестнадцатеричных цифр а, Ь, с, d, e, f, то здесь ситуация несколькосложнее. Алгоритм должен распознавать эти символы и производить дополнительные действия при их преобразовании в соответствующее двоичное число.
Внимательный взгляд на символы шестнадцатеричных цифр и соответствующие имдвоичные представления (см. табл. 6.1) говорит о том, для преобразования уже недостаточно простого вычитания или обнуления старшей тетрады. Анализ таблицыASCII показывает, что символы прописных букв шестнадцатеричных цифр отличаются от своего двоичного эквивалента на величину 37h. Соответствующие строчные буквы шестнадцатеричных цифр отличаются от своего двоичного эквивалента на 67h.; Отсюда следует вывод второй. Алгоритм преобразования должен различатьПрописные и строчные буквенные символы шестнадцатеричных цифр и корректировать значение ASCII-кода на величину 37h или 67h.Обратите внимание на то, что после записи значения шестнадцатеричной цифры следует символ «h». Как упоминалось в главе 4, это сделано для того, чтобытранслятор мог различить в программе одинаковые по форме записи десятичныеи шестнадцатеричные числа.В листинге 6.1 приведен исходный текст программы, которая решает задачупреобразования двузначного шестнадцатеричного числа в символьном виде в двоичное представление.Листинг 6.1.