Главная страница
Навигация по странице:

  • Операторы типа, длина и размеры

  • TYPE (тип), LENGTH (длина) и SIZE (размер)

  • Ввод и выполнение программ Ввод программы

  • Ассемблирование программы

  • LINK

  • Макросредства Простое макроопределение

  • Использование параметров в макрокомандах

  • Команды обработки строк лекция. Команды обработки строк. Свойства операций над строками


    Скачать 93.13 Kb.
    НазваниеКоманды обработки строк. Свойства операций над строками
    АнкорКоманды обработки строк лекция.docx
    Дата20.09.2018
    Размер93.13 Kb.
    Формат файлаdocx
    Имя файлаКоманды обработки строк лекция.docx
    ТипДокументы
    #24846
    страница2 из 5
    1   2   3   4   5

    Транслирующая команда XLAT

    Команда XLAT транслирует содержимое одного байта в другое предопределенное значение. С помощью команды XLAT можно проверить корректность содержимого элементов данных. При передаче данных между персональным компьютером и ЕС ЭВМ (IBM) с помощью команды XLAT можно выполнить перекодировку данных между форматами ASCII и EBCDIC.

    В следующем примере происходит преобразование цифр от 0 до 9 из кода ASCII в код EBCDIC. Так как представление цифр в ASCII выглядит как шест.30-39, а в EBCDIC — шест.F0-F9, то замену можно выполнить командой OR. Однако, дополнительно преобразуем все остальные коды ASCII в пробел (шест.40) в коде EBCDIC. Для команды XLAT необходимо определить таблицу перекодировки, которая учитывает все 256 возможных символов, с кодами EBCDIC в ASCII позициях:

    XLTBL DB 47 DUP(40H) ;Пробелы в коде EBCDIC

    DB 0F0H,0F1H,0F2H,0F3H,...,0F9H ;0-9 (EBCDIC)

    DB 199 DUP(40H) ;Пробелы в коде EBCDIC
    Команда XLAT предполагает адрес таблицы в регистре BX, а транслируемый байт (например, поля ASCNO) в регистре AL. Следующие команды выполняют подготовку и трансляцию байта:

    LEA BX,XLTBL

    MOV AL,ASCNO

    XLAT

    Команда XLAT использует значение в регистре AL в качестве относительного aдреса в таблице, то есть, складывает адрес в BX и смещение в AL. В случае, если, например, ASCNO содержит 00, то адрес байта в таблице будет XLTBL+00 и команда XLAT заменит 00 на шест.40 из таблицы. В случае, если поле ASCNO cодержит шест.32, то адрес соответствующего байта в таблице будет XLTBL+50. Этот байт содержит шест.F2 (2 в коде EBCDIC), который команда XLAT загружает в регистр AL.
    Операторы типа, длина и размеры

    Ассемблер содержит ряд специальных операторов, которые могут оказаться полезными при программировании. Например, при изменении длины таблицы придется модифицировать программу (для нового определения таблицы) и процедуры, проверяющие конец таблицы. В этом случае использование операторов TYPE (тип), LENGTH (длина) и SIZE (размер) позволяют уменьшить число модифицируемых команд.
    Рассмотрим определение следующей таблицы из десяти слов:

    TABLEX DW 10 DUP(?) ;Таблица из 10 слов

    Программа может использовать оператор TYPE для определения типа (DW в данном случае), оператор LENGTH для определения DUP-фактора (10) и оператор SIZE для определения числа байтов (10 х 2 = 20). Следующие команды иллюстрируют три таких применения:

    MOV AX,TYPE

    TABLEX ;AX=0002

    MOV BX,LENGTH

    TABLEX ;BX=000A (10)

    MOV CX,SIZE

    TABLEX ;CX=0014 (20)

    Значения LENGTH и SIZE можно использовать для окончания табличного поиска или сортировки. Например, если регистр SI содержит продвинутый адрес таблицы при осуществлении поиска, то проверка на конец таблицы может быть следующий:

    CMP SI,SIZE

    TABLEX

    Ввод и выполнение программ
    Ввод программы

    Исходный текст программы, предназначенный для ввода с помощью текстового редактора можно ввести при помощи DOS EDLIN или другого текстового редактора.

    Для ввода исходной программы наберите команду:

    EDLIN имя программы.ASM [Enter]

    В результате DOS загрузит EDLIN в памяти и появится сообщение «New file» и приглашение «*-». Введите команду I для ввода строк, и затем наберите каждую ассемблерную команду.

    Хотя число пробелов в тексте для Ассемблера не существенно, старайтесь записывать метки, команды, операнды и комментарии, выровненными в колонки, программа будет более yдобочитаемая. Для этого в EDLIN используется табуляция через каждые восемь позиций.

    После ввода программы убедитесь в ее правильности. Затем наберите E (и Enter) для завершения EDLIN. Можно проверить наличие программы в каталоге на диске, введите:

    DIR (для всех файлов)

    или

    DIR имя программы.ASM (для одного файла)

    В случае, если предполагается ввод исходного текста большего объема, то лучшим применением будет полноэкранный редактор. Для получения распечатки программы включите принтер и установите в него бумагу. Вызовите программу PRINT. DOS загрузит программу в память и распечатает текст на принтере:

    PRINT имя программы.ASM [Enter]

    Программа еще не может быть выполнена — прежде необходимо провести ее ассемблирование и компоновку.
    Подготовка программы для выполнения

    После ввода на диск исходной программы необходимо проделать два основных шага, прежде чем программу можно будет выполнить. Сначала необходимо ассемблиpовать программу, а затем выполнить компоновку. Программисты на языке бейсик могут выполнить программу сразу после ввода исходного текста, в то время как для Ассемблера и компилярных языков нужны шаги трансляции и компоновки.

    Шаг ассемблирования включает в себя трансляцию исходного кода в машинный объектный код и генерацию OBJ-модуля. OBJ-модуль уже более приближен к исполнительной форме, но еще не готов к выполнению.

    Шаг компоновки включает преобразование OBJ-модуля в EXE (исполнимый) модуль, содержащий машинный код. Программа LINK, находящаяся на диске DOS, выполняет следующее:

    1. Завершает формирование в OBJ-модуле адресов, которые остались неопределенными после ассемблирования. Во многих следующих программах такие адреса Ассемблер отмечает как R.

    2. Компонует, если необходимо, более одного отдельно ассемблированного модуля в одну загрузочную (выполнимую) программу; возможно две или более ассемблерных программ или ассемблерную программу с программами, написанными на языках высокого уровня, таких как Паскаль или Бейсик.

    3. Инициализирует EXE-модуль командами загрузки для выполнения.

    После компоновки OBJ-модуля (одного или более) в EXE-модуль, можно выполнить EXE-модуль любое число раз. Но, если необходимо внести некоторые изменения в EXE-модуль, следует скорректировать исходную программу, ассемблировать ее в другой OBJ-модуль и выполнить компоновку OBJ-модуля в новый EXE-модуль. Даже, если эти шаги пока остаются непонятными, вы обнаружите, что, получив немного навыка, весь процесс подготовки EXE-модуля будет доведен до автоматизма. Заметьте: определенные типы EXE-программ можно преобразовать в очень эффективные COM-программы.
    Ассемблирование программы

    Для того, чтобы выполнить исходную ассемблерную программу, необходимо прежде провести ее ассемблирование и затем компоновку. На дискете с ассемблерным пакетом имеются две версии aссемблера. ASM.EXE — сокращенная версия с отсутствием некоторых незначительных возможностей и MASM.EXE — полная версия. В случае, если размеры памяти позволяют, то используйте версию MASM.

    Простейший вариант вызова программы ассемблирования — это ввод команды MASM (или ASM), что приведет к загрузке программы Ассемблера с диска в память. На экране появится:

    source filename [.ASM]:

    object filename [filename.OBJ]:

    source listing [NUL.LST]:

    cross-reference [NUL.CRF]:

    Курсор при этом расположится в конце первой строки, где необходимо указать имя файла. Не следует набирать тип файла ASM, так как Ассемблер подразумевает это.

    Во втором запросе предполагается аналогичное имя файла (но можно его заменить).

    Третий запрос предполагает, что листинг ассемблирования программы не требуется.

    Последний запрос предполагает, что листинг перекрестных cсылок не требуется.

    В случае, если вы хотите оставить значения по умолчанию, то в трех последних запросах просто нажмите Enter.

    Всегда необходимо вводить имя исходного файла и, обычно, запрашивать OBJ-файл — это требуется для компоновки программы в загрузочный файл.

    Возможно потребуется указание LST-файла, особенно, если необходимо проверить сгенерированный машинный код. CRF-файл полезен для очень больших программ, где необходимо видеть, какие команды ссылаются на какие поля данных. Кроме того, Ассемблер генерирует в LST-файле номера строк, которые используются в CRF-файле.

    Ассемблер преобразует исходные команды в машинный код и выдает на экран сообщения о возможных ошибках. Типичными ошибками являются нарушения ассемблерных соглашений по именам, неправильное написание команд (например, MOVE вместо MOV), а также наличие в опеpандах неопределенных имен. Программа ASM выдает только коды ошибок, которые объяснены в руководстве по Ассемблеру, в то время как программа MASM выдает и коды ошибок, и пояснения к ним. Всего имеется около 100 сообщений об ошибках.

    Ассемблер делает попытки скорректировать некоторые ошибки, но в любом случае следует перезагрузить текстовый редактор, исправить исходную программу и повторить ассемблирование.

    Листинг содержит не только исходный текст, но также слева транслированный машинный код в шестнадцатеричном формате. В самой левой колонке находится шест.адреса команд и данных.

    За листингом ассемблирования программы следует таблица идентификаторов. Первая часть таблицы содержит определенные в программе сегменты и группы вместе с их размером в байтах, выравниванием и классом.

    Вторая часть содержит идентификаторы — имена полей данных в сегменте данных и метки, назначенные командам в сегменте кодов. Для того, чтобы Ассемблер не создавал эту таблицу, следует указать параметр /N вслед за командой MASM, то есть:

    MASM/N
    Компоновка программы

    В случае, если в результате ассемблирования не обнаружено ошибок, то cледующий шаг — компоновка объектного модуля. Файл имя программы.OBJ содержит только машинный код в шестнадцатеричной форме. Так как программа может загружаться почти в любое место памяти для выполнения, то Ассемблер может не определить все машинные адреса. Кроме того, могут использоваться другие (под) программы для объединения с основной. Назначением программы LINK является завершение определения адресных ссылок и объединение (если требуется) нескольких программ.

    Для компоновки ассемблированной программы введите команду LINK и нажмите клавишу Enter. После загрузки в память, компоновщик выдает несколько запросов (аналогично MASM), на которые необходимо ответить:

    Object Modules [.OBJ]: имя программы

    Компонует имя программы.OBJ

    Run file [имя программы.EXE]:

    Создает имя программы.EXE

    List file [NUL.MAP]: CON

    Создает имя программы.MAP

    Libraries [.LIB]: [Enter]

    По умолчанию

    Первый запрос — запрос имен объектных модулей для компоновки, тип OBJ можно опустить.

    Второй запрос — запрос имени исполнимого модуля (файла), (по умолчанию имя программы.EXE). Практика сохранения одного имени (при разных типах) файла упрощает работу с программами.

    Третий запрос предполагает, что LINK выбирает значение по yмолчанию — NUL.MAP (то есть, MAP отсутствует). MAP-файл содержит таблицу имен и размеров сегментов и ошибки, которые обнаружит LINK. Типичной ошибкой является неправильное определение сегмента стека. Ответ CON предполагает, что таблица будет выведена на экран, вместо записи ее на диск. Это позволяет сэкономить место в дисковой памяти и сразу просмотреть таблицу непосредственно на экране.

    Для ответа на четвертый запрос — нажмите Enter, что укажет компоновщику LINK принять остальные параметры по yмолчанию.

    На данном этапе единственной возможной ошибкой может быть yказание неправильных имен файлов. Исправить это можно только перезапуском программы LINK.
    Макросредства
    Простое макроопределение

    Для каждой закодированной команды Ассемблер генерирует одну команду на машинном языке. Но для каждого закодированного оператора компиляторного языка Pascal или C генерируется один или более (чаще много) команд машинного языка. В этом отношении можно считать, что компиляторный язык состоит из макрооператоров.

    Ассемблер MASM также имеет макросредства, но макросы здесь определяются программистом. Для этого задается имя макроса, директива MACRO, различные ассемблерные команды, которые должен генерировать данный макрос и для завершения макроопределения — директива MEND. Затем в любом месте программы, где необходимо выполнение определенных в макрокоманде команд, достаточно закодировать имя макроса. В результате Ассемблер сгенерирует необходимые команды.

    Использование макрокоманд позволяет:

    u  упростить и сократить исходный текст программы;

    u  сделать программу более понятной;

    u  уменьшить число возможных ошибок кодирования.

    Примерами макрокоманд могут быть операции ввода-вывода, связанные с инициализацией регистров и выполнения прерываний преобразования ASCII и двоичного форматов данных, арифметические операции над длинными полями, обработка строковых данных, деление с помощью вычитания.

    Макроопределение должно находиться до определения сегмента.

    Директива MACRO указывает Ассемблеру, что следующие команды до директивы ENDM являются частью макроопределения.

    Директива ENDM завершает макроопределение. Команды между директивами MACRO и ENDM составляют тело макроопределения.

    Имена, на которые имеются ссылки в макроопределении должны быть определены где-нибудь в другом месте программы.

    Макрокоманда INIT1 может использоваться в кодовом сегменте там, где необходимо инициализировать регистры. Когда Ассемблер анализирует команду INIT1, он сначала просматривает таблицу мнемокодов и, не обнаружив там соответствующего элемента, проверяет макрокоманды. Так как программа содержит определение макрокоманды INIT1 Ассемблер подставляет тело макроопределения, генерируя необходимые команды — макрорасширение.

    Программа использует рассматриваемую макрокоманду только один раз, хотя имеются другие макрокоманды, предназначенные на любое число применений и для таких макрокоманд Ассемблер генерирует одинаковые макрорасширения.
    Использование параметров в макрокомандах

    Формальные параметры в макроопределении указывают Ассемблеру на соответствие их имен любым аналогичным именам в теле макроопределения. Формальные параметры могут иметь любые правильные ассемблерные имена, не обязательно совпадающими именами в сегменте данных.

    Формальный параметр может иметь любое правильное ассемблерное имя (включая имя регистра, например, CX), которое в процессе ассемблирования будет заменено на параметр макрокоманды. Отсюда следует, что Ассемблер не распознает регистровые имена и имена, определенные в области данных, как таковые. В одной макрокоманде может быть определено любое число формальных параметров, разделенных запятыми, вплоть до 120 колонки в строке.

    Комментарии

    Для пояснений назначения макроопределения в нем могут находиться комментарии. Директива COMMENT или символ точка с запятой указывают на строку комментария, как это показано в следующем макроопределении PROMPT:

    PROMPT MACRO MESSGE ;Эта макрокоманда выводит сообщения на экран

    MOV AH,09H

    LEA DX,MESSGE

    INT 21H

    ENDM

    Так как по умолчанию в листинг попадают только команды генерирующие объектный код, то Ассемблер не будет автоматически выдавать и комментарии, имеющиеся в макроопределении.

    В случае, если необходимо, чтобы в расширении появлялись комментарии, следует использовать перед макрокомандой директиву .LALL («list all» — выводить все), которая кодируется вместе с лидирующей точкой:

    .LALL PROMPT MESSAG1

    Макроопределение может содержать несколько комментариев, причем некоторые из них могут выдаваться в листинге, а другие — нет. В первом случае необходимо использовать директиву .LALL. Во втором — кодировать перед комментарием два символа точка с запятой (;;) — признак подавления вывода комментария в листинг.

    По умолчанию в Ассемблере действует директива .XALL, которая выводит в листинг только команды, генерирующие объектный код. И, наконец, можно запретить появление в листинге ассемблерного кода в макрорасширениях, особенно при использовании макрокоманды в одной программе несколько раз.

    Для этого служит директива .SALL («suppress all» — подавить весь вывод), которая уменьшает размер выводимого листинга, но не оказывает никакого влияния на размер объектного модуля.

    Директивы управления листингом .LALL, .XALL, .SALL сохраняют свое действие по всему тексту программы, пока другая директива листинга не изменит его. Эти директивы можно размещать в программе так, чтобы в одних макрокомандах распечатывались комментарии, в других — макрорасширения, а в третьих подавлялся вывод в листинг.
    Использование макрокоманд в макроопределениях

    Макроопределение может содержать ссылку на другое макроопределение.

    Рассмотрим простое макроопределение DOS21, которое заносит в регистр AH номер функции DOS и выполняет INT 21H:

    DOS21 MACRO DOSFUNC

    MOV AH,DOSFUNC

    INT 21H

    ENDM

    Для использования данной макрокоманды при вводе с клавиатуры необходимо закодировать:

    LEA DX,NAMEPAR DOS21 0AH

    Предположим, что имеется другое макроопределение, использующее функцию 02 в регистре AH для вывода символа:

    DISP MACRO CHAR

    MOV AH,02

    MOV DL,CHAR

    INT 21H

    ENDM

    Для вывода на экран, например, звездочки достаточно закодировать макрокоманду DISP '*'. Можно изменить макроопределение DISP, воспользовавшись макрокомандой DOC21:

    DISP MACRO CHAR

    MOV DL,CHAR

    DOS21 02

    ENDM

     
    Теперь, если закодировать макрокоманду DISP в виде DISP '*', то Ассемблер сгенерирует следующие команды:

    MOV DL,'*'

    MOV AH,02

    INT 21H
    Директива LOCAL

    В некоторых макрокомандах требуется определять элементы данных или метки команд.

    При использовании такой макрокоманды в программе более одного раза происходит также неоднократное определение одинаковых полей данных или меток. В результате Ассемблер выдаст сообщения об ошибке из-за дублирования имен.

    Для обеспечения уникальности генерируемых в каждом макрорасширении имен используется директива LOCAL, которая кодируется непосредственно после директивы MACRO, даже перед комментариями. Общий формат имеет следующий вид:

    LOCAL dummy-1,dummy-2,... ;Формальные параметры
    1   2   3   4   5


    написать администратору сайта