Основы Pascal. Типы данных. Структура программы на языке Pascal

Вид материалаДокументы
Структура документа
Основы Assembler`а (регистры микропроцессора, основные команды).
Классификация команд Ассемблера по назначению. Логические команды.
Ассемблер: команды пересылки данных, команда безусловной передачи управления.
Команды условной передачи управления в языке Ассемблер.
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   17






Контейнеры





Жирный шрифт в тексте.







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

Пример 2. Правильное сочетание тегов







Вложение тегов






Полужирный курсивный текст






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

Пример 3. Неправильное сочетание тегов







Ошибка во вложении тегов






Полужирный курсивный текст






В данном примере нарушена вложенность тегов один в другой. Хотя браузер и отобразит пример корректно, самостоятельно «догадавшись» что от него хотят, подобных ошибок следует избегать, поскольку они приводят к замедлению работы страницы и к неправильной демонстрации страницы в большинстве случаев.

Структура документа

Все нормальные веб-страницы состоят из двух разделов — заголовка () и тела документа (). Раздел заголовка может содержать текст и теги, но содержимое этого раздела не показывается напрямую на странице. Тело документа предназначено для размещения тегов и содержательной части (пример 4).

Пример 4. Простейший HTML-документ













DOCTYPE

Элемент предназначен для указания типа текущего документа — DTD (document type definition, описание типа документа). Это необходимо, чтобы браузер понимал, как следует интерпретировать текущую веб-страницу, ведь HTML существует в нескольких версиях, кроме того, имеется XHTML (EXtensible HyperText Markup Language, расширенный язык разметки гипертекста), похожий на HTML, но различающийся с ним по синтаксису. Чтобы браузер «не путался» и понимал, согласно какому стандарту отображать веб-страницу и необходимо в первой строке кода задавать .

Существует несколько видов , они различаются в зависимости от версии HTML, на которую ориентированы. В табл. 1. приведены основные типы документов с их описанием.

Табл. 1. Допустимые DTDDOCTYPE Описание

HTML 4.01

DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "g/TR/html4/strict.dtd"> Строгий синтаксис HTML.

Переходный синтаксис HTML.

В HTML-документе применяются фреймы.

XHTML 1.0

Строгий синтаксис XHTML.

Переходный синтаксис XHTML.

Документ написан на XHTML и содержит фреймы.

XHTML 1.1

Разработчики XHTML 1.1 предполагают, что он постепенно вытеснит HTML. Как видите, никакого деления на виды это определение не имеет, поскольку синтаксис один и подчиняется четким правилам.

Раздел заголовка документа ()

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

Заголовок страницы (тег )<br /> <br /> Используется для отображения строки текста в левом верхнем углу окна браузера. Такая строка сообщает пользователю название сайта и другую информацию, которую добавляет разработчик.<br /> <br /> CSS (Cascading Style Sheets, Каскадные таблицы стилей) <br /> <br /> Стили хранят набор элементов форматирования, который применяется к тексту документа, чтобы быстро изменить его внешний вид.<br /> <br /> Метатеги (тег <META>)<br /> <br /> Метатеги используются для хранения информации предназначенной для браузеров и поисковых систем. Например, механизмы поисковых систем обращаются к метатегам для получения описания сайта, ключевых слов и других данных. Хотя тег <META> всего один, он имеет множество параметров, поэтому для его обращения применяется множественное число.<br /> <br /> Скрипты<br /> <br /> Скриптом традиционно называют программу, которая внедряется в тело веб-страницы и выполняет на ней определенные действия. Распространенным языком программирования для написания скриптов является " onclick="return false"> <br /> Порядок тегов в заголовке документа особого значения не имеет. <br /> <br /> Тело документа (<BODY>)<br /> <br /> Тело документа предназначено для отображения данных на веб-странице, в частности, в теле размещается текст, изображения, ссылки, таблицы, списки и т.д. <br /> <br /> Комментарии<br /> <br /> Как показано в примере 4, некоторый текст можно скрыть от показа в браузере, сделав его комментарием. Хотя такой текст пользователь не увидит, он все равно будет передаваться в документе, так что, посмотрев исходный код, можно обнаружить скрываемую информацию. <br /> <br /> Комментарии начинаются тегом . Все, что находится между этими тегами отображаться на веб-странице не будет.<br /><br /><br /><b>Браузеры</b><br /> <br /> Текстовые документы, содержащие код на языке HTML (такие документы традиционно имеют расширение .phpl или .php), обрабатываются специальными приложениями, которые отображают документ в его форматированном виде. Такие приложения, называемые «браузерами» или «интернет-обозревателями», обычно предоставляют пользователю удобный интерфейс для запроса веб-страниц, их просмотра (и вывода на иные внешние устройства) и, при необходимости, отправки введённых пользователем данных на сервер. Наиболее популярными на сегодняшний день браузерами являются Internet Explorer, Mozilla Firefox, Safari, Google Chrome и Opera (см.: Браузер#Рыночные доли).<br /><br /><ol start=4> <li> <b> Основы Assembler`а (регистры микропроцессора, основные команды).</b><br /> </ol> <br /> Ассемблер — низкоуровневый машинно-ориентированный язык программирования. Реализация языка зависит от типа процессора и определяется архитектурой вычислительной системы. Ассемблер позволяет напрямую работать с аппаратурой компьютера. Программа на языке ассемблера включает в себя набор команд, которые после трансляции преобразуются в машинные команды. Обычно каждой команде ассемблера соответствует одна машинная команда. Благодаря этому ассемблерные программы могут значительно быстрее выполняться, по сравнению с аналогичными программами, написанными на других языках, и позволяют эффективнее работать с ресурсами компьютера. Далее рассмотрим основные элементы и конструкции языка ассемблер для процессора Intel 8088, являющегося «прародителем» современных процессоров Intel Pentium.<br /> <br /> Ассемблерная программа может включать в себя следующие основные элементы: константы, команды, директивы и модификаторы. Имена используемых в программе переменных, меток и идентификаторов могут быть длиной до 31 символа и не должны начинаться с цифры. Константы языка ассемблер подразделяются на два типа: целые числа и строки. Целые числа могут быть представлены в двоичном (в этом случае они заканчиваются буквой b), десятичном (без специального окончания или заканчиваются буквой d) и шестнадцатеричном виде (заканчиваются буквой h). Шестнадцатеричные числа обязательно должны начинаться с цифры, т.е. если первым знаком числа является буква, то оно должно предваряться цифрой 0. Кроме того, отрицательные шестнадцатеричные числа должны записываться только в дополнительном коде. Например, число D3h в программе на ассемблере следует записывать как 0D3h, а число –7Bh как 185h. Отрицательные двоичные числа должны быть представлены в модифицированном дополнительном коде. Например, число –10010 будет записано в программе как 1101110. Строка в ассемблере представляет собой набор любых символов, заключенных в одинарные или двойные кавычки. Например: “Язык Ассемблер для процессора Intel 8088”.<br /> <br /> Команды и директивы языка Ассемблер.<br /> <br /> Команды или операторы языка Ассемблер имеют следующий формат (здесь и далее при описании языка элементы, заключенные в квадратные скобки, необязательны, а в угловых скобках даны определяемые далее элементы):<br /> <br /> [<Метка>[:]] <Код оператора> [<Операнды>] [;<Комментарий>]<br /> <br /> Элементы команды отделяются друг от друга пробелами. Код оператора представляет собой мнемокод команды, включающий от 2 до 6 букв. Операнд может быть явно заданным прямым или косвенным адресом, именем метки, именем или значением переменной, ассоциативным признаком и т.п. Если операндов несколько, то они отделяются друг от друга запятой. Количество и вид требуемых операндов зависят от кода оператора. В большинстве двухадресных команд присутствуют операнды приемника и источника. При выполнении команды содержимое источника не меняется, а в приемнике первое число, участвующее в операции, заменяется на полученный результат. Метка представляет собой имя команды ассемблера длиной до 31 символа, используемое для обращения к ней из других команд. Если после метки стоит двоеточие, то это означает, что метка находится в текущем сегменте памяти. Комментарий предназначен для пояснения команды и может содержать любой текст.<br /> <br /> Директивы или псевдооператоры Ассемблера представляют собой инструкции транслятору. <b>В отличие от команд, являющихся инструкциями машине, директивы обрабатываются только в ходе трансляции программы в машинный код, а не в ходе её выполнения на компьютере</b>. Директивы имеют следующий формат:<br /> <br /> [<Идентификатор>] <Код псевдооператора> [<Операнды>] [;<Комментарий>]<br /> <br /> Элементы директив также отделяются друг от друга пробелами. Идентификатор представляет собой имя директивы, используемое для обращения к ней. Код псевдооператора задает мнемокод директивы, включающий от 2 до 7 букв. Операнды могут содержать помимо адресов, имен и значений также простые выражения. Если операндов несколько, они разделяются запятыми.<br /> <br /> Модификаторы в языке Ассемблер.<br /> <br /> Модификаторы используются в командах и директивах Ассемблера для выполнения некоторых операций над операндами, обрабатываемых в ходе трансляции программы. Наиболее часто применяются следующие модификаторы.<br /> <br /> 1. Арифметические модификаторы, имеющие формат <Операнд> <Модификатор> <Операнд>. Включают: «+» — сложить, «–» — вычесть, «*» — умножить, «/» — разделить, mod — остаток от деления.<br /> <br /> 2. Логические модификаторы, имеющие формат <Операнд> <Модификатор> <Операнд>. Включают: and — «логическое и», or — «логическое или», not — «логическое отрицание», xor — «исключающее или».<br /> <br /> 3. Модификаторы отношения, имеющие формат <Операнд> <Модификатор> <Операнд>. Включают: eq — совпадение, neq — несовпадение, lt — меньше, gt — больше, le — меньше или равно, ge — больше или равно.<br /> <br /> 4. Модификаторы, возвращающие значения. Имеют формат <Модификатор> <Операнд>. Включают: $ — возвращает значение смещения адреса текущего оператора; seg — возвращает адрес сегмента адреса метки или переменной; offset — возвращает смещение адреса метки или переменной; length — возвращает длину операнда в единицах определения (байтах или словах); type — возвращает атрибут типа переменной (1 — byte, 2 — word, 4 — dword) или метки (1 — near, 3 — far); size — возвращает длину операнда в байтах.<br /> <br /> 5. Модификаторы присваивания атрибута, включающие:<br /> <ul> <li> ptr — изменяет атрибут типа операнда или атрибут дистанции адресного операнда. Формат: <тип> ptr <операнд>, где тип — новый атрибут, операнд — идентификатор операнда, чей атрибут изменяется. Атрибуты типа бывают: byte — длиной 1 байт, word — длиной 2 байта, dword — длиной 4 байта. Атрибуты дистанции подразделяются на near — близкий, в пределах одного сегмента, и far — далекий, за пределами одного сегмента.<br /> <li> cs, ds, es, ss — изменяют атрибут сегмента адреса. Формат: <имя регистра сегмента>:<адрес>, где адрес может быть задан именем сегмента, переменной, меткой или адресным выражением.<br /> <li> short — дополняет атрибут near метки в операторе перехода и указывает, что переход осуществляется на расстояние не более ±128 байтов от текущей команды. Формат: short <метка>.<br /> <li> high, low — возвращают соответственно старший и младший байт 16-битового значения операнда. Формат: <модификатор> <операнд>.<br /> </ul> <br /> Регистры процессора (микропроцессорная память).<br /> <br /> Микропроцессорная память процессора 8088 включает 14 двухбайтовых запоминающих регистров. По назначению они делятся на 4 группы.<br /> <br /> Универсальные регистры AX, BX, CX, DX. Каждый из универсальных регистров может использоваться для временного хранения любых данных. Разрешается работать как с регистром целиком, так и отдельно с каждой его половиной. Для обращения к старшим байтам используются регистры AH, BH, CH, DH, для обращения к младшим байтам — регистры AL, BL, CL, DL. Каждый из универсальных регистров может использоваться как специальный при выполнении некоторых конкретных команд программы.<br /> <ul> <li> Регистр AX — регистр-аккумулятор, через который осуществляется ввод-вывод данных в процессор. При выполнении операций умножения и деления AX используется для хранения 1-го операнда и результата операции после её завершения.<br /> <li> Регистр BX часто используется для хранения адреса базы в сегменте данных и начального адреса поля памяти при работе с массивами.<br /> <li> Регистр CX — регистр-счетчик, используемый как счетчик числа повторений при циклических операциях.<br /> <li> Регистр DX используется как расширение регистра AX при работе с 32-разрядными числами и при выполнении операций умножения и деления, а также для хранения номера порта при операциях ввода-вывода.<br /> </ul> <br /> Сегментные регистры CS, DS, SS, ES используются для хранения начальных адресов полей памяти (сегментов), отведенных в программах для команд программы (CS), данных (DS), стека (SS), данных при межсегментных пересылках (ES).<br /> <br /> Регистры смещений IP, SP, BP, SI, DI служат для хранения относительных адресов ячеек памяти внутри сегментов, т.е. смещений относительно начала сегментов. Регистр IP хранит смещение адреса текущей команды программы, SP — смещение вершины стека, т.е. текущий адрес стека, BP — смещение начального адреса поля памяти, непосредственно отведенного под стек, SI и DI хранят адреса индексов источника и приемника данных при операциях над строками и подобных им.<br /> <br /> Регистр флагов.<br /> <br /> Регистр флагов FL содержит 9 одноразрядных флагов, управляющих прохождением программы в компьютере. Из них 6 флагов являются статусными, отражающими результаты выполненных операций, а 3 — управляющими, определяющими режим исполнения программы. К статусным относятся флаги:<br /> <ul> <li> CF — флаг переноса. Содержит значения «переносов» (0 или 1) из старшего разряда при арифметических операциях и некоторых операциях сдвига.<br /> <li> PF — флаг четности. Хранит 0, если младшие 8 бит результата операции содержат нечетное число единичных битов, и 1, если четное.<br /> <li> AF — флаг логического переноса в двоично-десятичной арифметике, используемый при арифметических операциях над двоично-десятичными кодами и кодами ASCII. Устанавливается в 1, если операция приводит к переносу или заему 4-го справа бита однобайтового операнда.<br /> <li> ZF — флаг нуля, устанавливаемый в 1, если результат операции равен нулю.<br /> <li> SF — флаг знака, устанавливаемый в соответствии со знаком результата после арифметической операции. 0 соответствует положительному результату, 1 — отрицательному.<br /> <li> OF — флаг переполнения, устанавливаемый в 1 при арифметическом переполнении (если возник перенос в знаковый разряд, если частное от деления слишком велико и т.д.).<br /> </ul> <br /> К управляющим относятся флаги:<br /> <ul> <li> TF — флаг системного прерывания (трассировки). Единичное состояние этого флага переводит процессор в режим пошагового выполнения программы (трассировки).<br /> <li> IF — флаг прерываний, разрешающий (значение 1) или запрещающий (значение 0) прерывания.<br /> <li> DF — флаг направления, используемый в строковых операциях для задания направления обработки данных. При нулевом значении строки обрабатываются слева направо, при единичном — справа налево.<br /> </ul> <br /> Адресация регистров и ячеек памяти в языке Ассемблер. Варианты прямой адресации.<br /> <br /> При программировании на ассемблере можно использовать неявный, непосредственный, прямой и косвенный методы адресации. Для адресации регистров процессора допустим только прямой метод, а адресацию ячеек оперативной памяти можно выполнять прямым, косвенным и смешанным непосредственным методом.<br /> <br /> При непосредственной адресации в поле команды указывается величина операнда, которая может быть задана числом в десятичной, двоичной и шестнадцатеричной системах счисления или идентификатором, а также простым выражением, в котором указанные элементы связаны знаками арифметических операций +, –, * и /. Идентификатор должен быть предварительно описан в программе. Например: 100, 35d, D3h, 1100b, var*3, 272*A2h/4.<br /> <br /> Прямая адресация регистров процессора выполняется путем записи в качестве операнда символьного обозначения регистра. Например: AX, AH, AL, BX и т.д. При работе с регистрами следует учитывать, что разрядность второго операнда должна соответствовать разрядности принимающего регистра. В частности, диапазон чисел, допустимых для пересылки в регистр, ограничивается вместимостью последнего. В 1-байтовый регистр (AH, AL, BH и т.д.) можно записать число из диапазона от 0 до 255 или от –128 до 127, а в 2-байтовый регистр (AX, BX, CX и т.д.) — от 0 до 65535 или от –32768 до 32767.<br /> <br /> Адресация ячеек оперативной памяти в общем случае выполняется в соответствии со следующим выражением:<br /> <br /> А<sub>абс</sub> = А<sub>сегм</sub> + А<sub>исп</sub> = А<sub>сегм</sub> + А<sub>смещ</sub> [+А<sub>баз</sub>][+А<sub>инд</sub>],<br /> <br /> где А<sub>абс</sub> — абсолютный или полный (физический) адрес ячейки, А<sub>сегм</sub> — адрес сегмента ячейки, А<sub>исп</sub> — исполнительный адрес, А<sub>смещ</sub> — адрес смещения относительно начала сегмента или базы, А<sub>баз</sub> — адрес базы, А<sub>инд</sub> — адрес индекса.<br /> <br /> Прямая адресация ячеек памяти имеет несколько вариантов.<br /> <ul> <li> Прямая обычная адресация: field. Указывается символьное имя переменной, для которой были предварительно выделены ячейки памяти. В команде в качестве А<sub>исп</sub> берется А<sub>смещ</sub> первой ячейки, отведенной для переменной.<br /> <li> Прямая с индексированием: field[SI]. В команде используется А<sub>исп</sub> = А<sub>смещ</sub> + А<sub>инд</sub>, где адрес индекса берется из регистра SI.<br /> <li> Прямая с базированием: field[BX]. А<sub>исп</sub> = А<sub>смещ</sub> + А<sub>баз</sub>, где адрес базы берется из регистра BX.<br /> <li> Прямая с индексированием и базированием: field[BX+SI]. А<sub>исп</sub> = А<sub>смещ</sub> + А<sub>баз</sub> + А<sub>инд</sub>.<br /> </ul> <br /> Косвенная и смешанная адресация в языке Ассемблер.<br /> <br /> Косвенная адресация ячеек оперативной памяти имеет два варианта.<br /> <ul> <li> Косвенная обычная: [BX]. Исполнительный адрес извлекается из регистра BX.<br /> <li> Косвенная с индексированием: [BX+SI]. Исполнительный адрес определяется как сумма адресов из регистров BX и SI.<br /> </ul> <br /> Смешанная непосредственная адресация ячеек памяти имеет следующие варианты.<br /> <ul> <li> Непосредственная обычная: offset field. В качестве операнда берется смещение адреса первой ячейки поля памяти, отведенного для переменной с символьным именем field. offset указывает, что берется не значение переменной, а именно смещение её адреса.<br /> <li> Непосредственная с индексированием: [SI+const]. В качестве операнда берется сумма значения, хранящегося в регистре SI, и величины const. const может быть задана числом, идентификатором, смещением адреса переменной (offset field) или их комбинацией в форме простого выражения.<br /> <li> Непосредственная с базированием: [BX+const]. Аналогично предыдущему варианту, но вместо регистра SI используется BX.<br /> <li> Непосредственная с базированием и индексированием: [BX+SI+const]. Аналогично предыдущему, но вместо содержимого одного регистра, берется сумма содержимого регистров BX и SI.<br /> </ul> <br /> Команды ассемблера за исключением POP, PUSH, CALL, RET, IRET в качестве адреса сегмента по умолчанию используют адрес из регистра DS, а в исполняемых COM-программах — из регистра CS. Однако, регистр сегмента может быть задан и явно. Например: ES:field, SS:[SI]. Команды POP, PUSH, CALL, RET, IRET используют сегмент стека, т.е. адрес сегмента берется из регистра SS.<br /> <br /> Директивы определения идентификаторов и данных в языке Ассемблер.<br /> <br /> Директивы определения идентификаторов используются для присвоения идентификатору с заданным именем некоторого текстового или числового выражения. Фактически описывают используемые в программе именованные константы. Включают следующие директивы:<br /> <ul> <li> <имя> EQU <текст> — присваивает постоянное значение, которое в дальнейшем нельзя изменить. Текст может быть символьным, числовым или смешанным выражением, определяющим константу, адрес, другое символьное имя, метку и т.д. Например: ITQTY equ 10; INPERR equ Введены неверные данные.<br /> <li> <имя> = <числовое выражение> — присваивает текущее значение, которое в дальнейшем можно изменить на другое подобной директивой. Выражение может включать простые математические операции, которые обрабатываются в ходе трансляции для получения значения идентификатора. Например: NQ = 1; ADR = 4*24h; S = 5*24/8.<br /> </ul> <br /> Директивы определения данных используются для идентификации переменных и полей данных. Директивы позволяют объявить переменную, задав её имя, присвоить ячейкам памяти начальные значения или зарезервировать область памяти для последующего сохранения в ней некоторых значений. Имеют следующий формат:<br /> <br /> [<имя>] D<формат> <выражение>[, <выражение>][,…]<br /> <br /> где имя — набор символов, начинающийся с буквы, используемый для ссылки на переменную или поле данных. Формат может иметь следующие значения: B — байт, W — слово (2 байта), D — двойное слово (4 байта), Q — 8 байтов, T — 10 байтов. Выражение показывает, какое количество элементов памяти необходимо выделить и какие данные там будут содержаться. Выражение может быть:<br /> <ul> <li> константой: const1 DB 7; const2 DW 1026; const3 DD 2HCh. Значение константы должно соответствовать вместимости используемого поля данных. Так, для DB константа не может быть больше 255, для DW — больше 65535 и т.д.<br /> <li> простым выражением: v1 DB 17*3; v2 DW 365*10. Выражение вычисляется в ходе трансляции программы.<br /> <li> вектором или таблицей: vect DB 15, 8, –27; table DW 1530, 2043, 0, 0, 0, 48. В одной директиве допускается использовать до 132 элементов данных. Вместо повторения одного и того же значения несколько раз можно использовать псевдооператор DUP, например: table DW 1530, 2043, 3 dup(0), 48.<br /> <li> строкой символов: str DB ‘Неверные данные’. При использовании директивы DB строка может содержать до 255 символов. Для всех остальных директив (DW, DD, DQ, DT) — только 2 символа.<br /> <li> пустым полем: field1 DB ?; field2 DW 12 dup(?). В область резервируемой памяти при загрузке ничего не записывается.<br /> <li> символическим именем переменной: var1 DW vct; var2 DD tbl. Одна переменная определяется адресом другой. Такой вариант можно использовать, например, для хранения адресов ячеек памяти, меток, на которые допустимо ссылаться в программе. В этом случае, если переменная находится в том же сегменте, что и ссылающаяся команда, то достаточно в качестве адреса указать только смещение (2 байта), то есть при объявлении переменной использовать директиву DW. Если же переменная находится в другом сегменте, то надо указывать сегмент и смещение (всего 4 байта), а значит переменная должна быть объявлена директивой DD.<br /> </ul> <br /> Ассемблер: директивы определения сегментов и процедур, директивы управления трансляцией.<br /> <br /> Сегмент задается следующими псевдооператорами:<br /> <br /> <имя сегмента> segment<br /> <br /> <содержимое сегмента><br /> <br /> <имя сегмента> ends<br /> <br /> В программе можно использовать 4 сегмента (по числу сегментных регистров) и для каждого из них в сегменте кода следует указывать соответствующий регистр сегмента псевдооператором ASSUME, который имеет следующий формат: ASSUME <регистр сегмента>:<имя сегмента>[, …]. Например:<br /> <br /> COMMANDS segment<br /> <br /> assume CS:COMMANDS, DS:DATA, SS:STACK<br /> <br /> …<br /> <br /> COMMANDS ends<br /> <br /> После директивы ASSUME необходимо загрузить адрес начала сегмента данных в регистр DS, например так:<br /> <br /> mov AX, DATA<br /> <br /> mov DS, AX<br /> <br /> Инициализация сегментных регистров CS и SS выполняется автоматически.<br /> <br /> Процедура объявляется с помощью следующих псевдооператоров:<br /> <br /> <имя процедуры> proc [near|far]<br /> <br /> <команды процедуры><br /> <br /> ret<br /> <br /> <имя процедуры> endp<br /> <br /> Имя процедуры служит для её идентификации в программе. При объявлении процедуры после ключевого слова proc может быть указан атрибут дистанции: near — близкая процедура, расположенная в том же сегменте (обращение к ней допускается только из того же сегмента), far — дальний вызов (обращение к процедуре возможно из любого сегмента). Если атрибут дистанции не указан, то процедура считается близкой. Заканчивается процедура обычно командой выхода ret. Например:<br /> <br /> SUMN proc far<br /> <br /> …<br /> <br /> ret<br /> <br /> SUMN endp<br /> <br /> Наиболее часто используются следующие директивы:<br /> <ul> <li> TITLE <текст> — может использоваться для задания названия и описания программы. Текст может содержать любые символы. Например: TITLE sum — вычисление суммы чисел.<br /> <li> END [<имя программы>] — задает конец программы и указывает ассемблеру, где надо завершить трансляцию. Текст, находящийся за этой директивой, игнорируется транслятором.<br /> </ul> <br /> <b> Классификация команд Ассемблера по назначению. Логические команды.</b><br /> <br /> В соответствии с назначением можно выделить следующие ассемблерные команды (в скобках приведены примеры мнемокодов команд):<br /> <ul> <li> выполнения арифметических операций (ADD и ADC — сложения и сложения с переносом, SUB и SBB — вычитания и вычитания с заемом, MUL и IMUL — умножения без знака и со знаком, DIV и IDIV — деления без знака и со знаком, CMP — сравнения и т.д.);<br /> <li> выполнения логических операций (OR, AND, NOT, XOR, TEST и т.д.);<br /> <li> пересылки данных (MOV — переслать, XCHG — обменять, IN — ввести в процессор, OUT — вывести из процессора и т.д.);<br /> <li> передачи управления (JMP — безусловного перехода, J* — условного перехода, LOOP — управления циклом, CALL — вызова процедуры, RET — возврата из процедуры и т.д.);<br /> <li> обработки строк символов (MOVS — пересылки, CMPS — сравнения, LODS — загрузки, SCAS — сканирования);<br /> <li> прерывания работы программы (INT — программные прерывания, INTO — условного прерывания при переполнении, IRET — возврата из прерывания);<br /> <li> управления процессором (ST* и CL* — установки и сброса флагов, HLT — останова, WAIT — ожидания, NOP — холостого хода и т.д.).<br /> </ul> <br /> В большинстве команд операнды могут иметь один из следующих типов: регистр (далее будем обозначать как r, сегментный регистр как rsegm), область памяти (обозначение — m), непосредственное значение или простое выражение (обозначение — i). Выражение, заданное в операнде, вычисляется только при трансляции и значение регистров-флагов не меняет.<br /> <br /> К числу основных логических команд относятся следующие:<br /> <ul> <li> OR <приемник>, <источник> — выполняет поразрядную дизъюнкцию битов операндов, устанавливая 1 в тех битах приемника, в которых была 1 хотя бы у одного из исходных операндов. Операнды должны иметь одинаковый формат: байт или слово. Источник может иметь тип r, m, i, а приемник — r, кроме rsegm, или m. Нельзя, чтобы оба оператора были типа m. Команда сбрасывает в ноль флаги CF и OF и формирует флаги PF, SF и ZF.<br /> <li> AND <приемник>, <источник> — выполняет поразрядную конъюнкцию битов операндов, устанавливая 1 в тех битах приемника, в которых была 1 у обоих операндов. Операнды должны иметь одинаковый формат: байт или слово. Источник может иметь тип r, m, i, а приемник — r, кроме rsegm, или m. Нельзя, чтобы оба оператора были типа m. Команда сбрасывает в ноль флаги CF и OF и формирует флаги PF, SF и ZF.<br /> </ul> <br /> Арифметические команды языка Ассемблер.<br /> <br /> Ниже перечислены наиболее часто используемые арифметические команды языка Ассемблер.<br /> <ul> <li> ADD <приемник>, <источник> — сложение двоичных чисел. Содержимого источника складывается с содержимым приемника. Операнды должны иметь одинаковый формат: байт или слово. Источник может иметь тип r, m, i, а приемник — r или m. Нельзя использовать комбинации параметров, имеющих следующие типы: rsegm, i; rsegm, rsegm; m, m. Команда формирует флаги AF, CF, OF, PF, SF, ZF.<br /> <li> INC <приемник> — прибавляет 1 к содержимому приемника. Операнд может быть типа r или m. Команда формирует флаги AF, OF, PF, SF, ZF.<br /> <li> SUB <приемник>, <источник> — вычитание двоичных чисел. Содержимого источника вычитается из содержимого приемника. Операнды должны иметь одинаковый формат: байт или слово. Источник может иметь тип r, m, i, а приемник — r, кроме rsegm, или m. Нельзя, чтобы оба оператора были типа m. Команда формирует флаги AF, CF, OF, PF, SF, ZF.<br /> <li> DEC <приемник> — вычитает 1 из содержимого приемника. Операнд может быть типа r или m. Команда формирует флаги AF, OF, PF, SF, ZF.<br /> <li> MUL <источник>, IMUL <источник> — умножение чисел без знака и со знаком соответственно. Операнд представляет собой 8- или 16-битовый множитель и может быть типа r или m. Если источник имеет формат байт, то множимое хранится в регистре AL, произведение будет сохранено в AX. Если операнд имеет формат слово, то множимое берется из регистра AX, а результат сохраняется в регистрах DX и AX: старшие 2 байта результата в DX, а младшие — в AX. Команды формируют флаги CF и OF.<br /> <li> DIV <источник>, IDIV <источник> — деление чисел без знака и со знаком соответственно. Операнд представляет собой 8- или 16-битовый делитель и может быть типа r или m. Если источник имеет формат байт, то делимое хранится в регистре AX, частное будет сохранено в AL, а остаток от деления размещается в AH. Если операнд имеет формат слово, то в качестве делимого берется содержимое регистров DX и AX (старшие 2 байта в DX, а младшие в AX), частное от деления сохраняется в регистре AX, а остаток от деления в DL. Команды формируют флаг IF, который устанавливается в 1 при делении на 0 и делении большого числа на очень маленькое, если частное выходит за диапазон допустимых значений.<br /> <li> CMP <приемник>, <источник> — сравнение двоичных чисел. Операнды должны иметь одинаковый формат: байт или слово. Источник может иметь тип r, m, i, а приемник — r или m. Нельзя использовать комбинации параметров, имеющих следующие типы: rsegm, i; rsegm, rsegm; m, m. При сравнении беззнаковых чисел команда формирует флаги CF и ZF, а при сравнении чисел со знаком — CF, OF, SF, ZF.<br /> </ul> <br /> <b> Ассемблер: команды пересылки данных, команда безусловной передачи управления.</b><br /> <br /> Команды пересылки данных включают в себя:<br /> <ul> <li> MOV <приемник>, <источник> — пересылает в зависимости от формата операндов один байт или одно слово между регистрами или между регистром и памятью, то есть заносит непосредственное значение в регистр или память. Операнды должны иметь одинаковый формат — байт или слово. Нельзя в одной команде использовать rsegm совместно с i, два операнда типа m или два операнда типа rsegm.<br /> <li> PUSH <источник> — помещает в вершину стека содержимое источника, который может быть любым из 16-битовых регистров или парой ячеек памяти, содержащих 16-битовое слово. Команда уменьшает на 1 содержимое регистра SP.<br /> <li> POP <приемник> — снимает слово с вершины стека и помещает его в приемник, который может быть любым из 16-битовых регистров или парой ячеек памяти. Команда увеличивает на 1 содержимое регистра SP.<br /> </ul> <br /> Команда безусловной передачи управления JMP <операнд> — выполняет передачу управления по заданному адресу. В качестве операнда указывается прямой или косвенный адрес.<br /> <br /> Переход по прямому адресу выполняется командой JMP <метка>. Если метка расположена в том же сегменте, что и команда передачи управления, переход считается внутренним (near), в противном случае — внешним (far). В написании команды JMP разницы нет. Тип перехода определяется видом метки в момент её объявления: для внутреннего перехода после метки ставится двоеточие « : ». Транслятор по таблице меток и их адресов сам определяет атрибуты near или far и транслирует команду передачи управления соответственно в более короткую или более длинную машинную команду. Необязательный модификатор short перед меткой (т.е. команда вида JMP short <операнд>), позволяет немного сократить длину команды, указывая, что метка расположена не далее ±128 байтов от первого байта команды JMP.<br /> <br /> Косвенный адрес для перехода может быть задан в регистре или памяти. В этом случае в качестве операнда выступает имя регистра или области памяти соответственно. При использовании косвенной адресации необходимо указывать атрибут дистанции для операнда с помощью модификатора ptr. Например, JMP near ptr [SI], JMP far ptr [BX].<br /> <br /> <b> Команды условной передачи управления в языке Ассемблер.</b><br /> <br /> Команды условной передачи управления, называемые также иногда триггерами, имеют следующий общий формат:<br /> <br /> J<условие> <метка><br /> <br /> где условие — мнемокод проверяемого условия, метка — определяет адрес для перехода. Команда передает управление по прямому адресу — метке, если указанное в команде условие соблюдается. В противном случае выполняется следующая по порядку команда. Условная передача управления может быть только ближней (near) и короткой (short), то есть метка перехода должна быть в том же сегменте и не далее ±128 байт от команды условной передачи управления. Выполнение условия проверяется по состоянию флагов регистра FL, которые устанавливаются по результатам предыдущих операций, формирующих условие перехода, например арифметических, логических, сравнения и др.<br /> <br /> Команды условной передачи управления могут быть знаковыми, когда условие проверяется с учетом знака операндов, и беззнаковыми, когда условие проверяется по абсолютным значениям операндов. Какой тип команды использовать зависит от особенностей решаемой задачи и формата данных (знаковые или беззнаковые), над которыми выполняются операции, определяющие возможность перехода. Например, пусть регистр AX содержит 11011010, регистр BX — 00100110, и содержимое этих регистров сравнивается командой CMP AX, BX. В этом случае, если данные беззнаковые, то число в AX будет больше, а если знаковые — то меньше, т.к. единица в старшем разряде указывает, что число отрицательное.<br /> <br /> <b>Команды условной передачи управления для беззнаковых данных включают в себя:</b><br /> <ul> <li> JA/JNBE — переход, если больше/не меньше или равно, то есть, если флаги ZF=0 и CF=0.<br /> <li> JAE/JNB — переход, если больше или равно/не меньше, то есть, если флаг CF=0.<br /> <li> JB/JNAE — переход, если меньше/не больше или равно, то есть, если флаг CF=1.<br /> <li> JBE/JNA — переход, если меньше или равно/не больше, то есть, если флаги AF=1 или CF=1.<br /> </ul> <br /> <b>Команды условной передачи управления для знаковых данных включают в себя:</b><br /> <ul> <li> JG/JNLE — переход, если больше/не меньше или равно, то есть, если флаги ZF=0 и SF=OF.<br /> <li> JGE/JNL — переход, если больше или равно/не меньше, то есть, если флаг SF=OF.<br /> <li> JL/JNGE — переход, если меньше/не больше или равно, то есть, если флаг SF¹OF.<br /> <li> JLE/JNG — переход, если меньше или равно/не больше, то есть, если флаги ZF=1 или SF¹OF.<br /> </ul> <br /> <b>Команды условной передачи управления для остальных проверок включают в себя:</b><br /> <ul> <li> JE/JZ — переход, если равно/нуль, то есть, если флаг ZF=1.<br /> <li> JNE/JNZ — переход, если не равно/не нуль, то есть, если флаг ZF=0.<br /> <li> JS — переход, если знак отрицательный, то есть, если флаг SF=1.<br /> <li> JNS — переход, если знак положительный, то есть, если флаг SF=0.<br /> <li> JC — переход, если есть перенос, то есть, если флаг CF=1. Аналог команды JB.<br /> <li> JNC — переход, если нет переноса, то есть, если флаг CF=0. Аналог команды JNB.<br /> <li> JO — переход, если есть переполнение, то есть, если флаг OF=1.<br /> <li> JNO — переход, если нет переполнения, то есть, если флаг OF=0.<br /> <li> JP/JPE — переход, если есть четность, то есть, если флаг PF=1.<br /> <li> JNP/JPO — переход, если нет четности, то есть, если флаг PF=0.<br /> <li> JCXZ — переход, если содержимое регистра CX равно 0.<br /> </ul> <br /><br /></meta></meta></meta></i></body></meta></head></b></body>