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