Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Условное ассемблирование. Выражения. Операторы, используемые в выражениях.

Читайте также:
  1. Ароматизаторы, используемые в производстве пищевых продуктов.
  2. безусловное выполнение УВФК
  3. Виды административно-правовых форм государственного управления в административном праве классифицируются по содержанию и способу выражения.
  4. Виды запросов к БД, логические операторы, язык SQL, конструктор запросов.
  5. Виды избирательных систем. Основные методики определения результатов выборов. Избирательные системы, используемые в Российской Федерации.
  6. Внешние источники информации, используемые для анализа коммерческого банка.
  7. Внутренние источники информации, используемые для анализа коммерческого банка.
  8. Вопрос № 26. Акты прокурорского реагирования. Правовые средства прокурорского надзора, используемые для выявления, устранения и предупреждения нарушений закона.
  9. Вопрос №95 Правовой нигилизм. понятие, источники, формы выражения.
  10. Выражения.

В большинстве языков программирования присутствуют средства, позволяющие игнорировать тот или иной участок программы в зависимости от выполнения условий, например: в языке C это осуществляется командами препроцессора #if, #ifdef, #ifndef и т.д. Ассемблер тоже предоставляет такую возможность.

if выражение...endif

Если значение выражения — ноль (ложь), весь участок программы между IF и ENDIF игнорируется. Директива IF может также сочетаться с ELSE и ELSEIF:

if выражение...else...endif

Если значение выражения — ноль, ассемблируется участок программы от ELSE до ENDIF, в противном случае — от IF до ELSE.

if выражение1...elseif выражение2...elseif выражение3...else...endif

Так, если, например, выражение 2 не равно нулю, будет ассемблироваться участок программы между первой и второй директивой ELSEIF. Если все три выражения равны нулю, ассемблируется фрагмент от ELSE до ENDIF. Данная структура директив может использоваться в частном случае аналогично операторам switch/case языков высокого уровня, если выражения — проверки некоторой константы на равенство.

Кроме общих директив IF и ELSEIF ассемблеры поддерживают набор специальных команд, каждая из которых проверяет специальное условие:

IF1/ELSEIF1 — если ассемблер выполняет первый проход ассемблирования;

IF2/ELSEIF2 — если ассемблер выполняет второй проход ассемблирования (часто не работает на современных ассемблерах);

IFE выражение/ELSEIFE выражение — если выражение равно нулю (ложно);

IFDEF метка/ELSEIFDEF метка — если метка определена;

IFNDEF метка/ELSEIFNDEF метка — если метка не определена;

IFB <аргумент>/ELSEIFB <аргумент> — если значение аргумента — пробел (эти и все следующие директивы используются в макроопределениях для проверки параметров);

IFNB <аргумент>/ELSEIFNB <аргумент> — если значение аргумента — не пробел (используется в макроопределениях для проверки переданных параметров);

IFDIF <арг1>,<арг2>/ELSEIFDIF <арг1>,<арг2> — если аргументы отличаются (с различием больших и маленьких букв);

IFDIFI <арг1>,<арг2>/ELSEIFDIFI <арг1>,<арг2> — если аргументы отличаются (без различия больших и маленьких букв);

IFIDN <арг1>,<арг2>/ELSEIFIDN <арг1>,<арг2> — если аргументы одинаковы (с различием больших и маленьких букв);

IFIDNI <арг1>,<арг2>/ELSEIFIDNI <арг1>,<арг2> — если аргументы одинаковы (без различия больших и маленьких букв).

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

if $ gt 65535; Если адрес вышел за пределы сегмента..errendif

Встретив директиву.ERR, ассемблер прекратит работу с сообщением об ошибке. Аналогично командам условного ассемблирования существуют модификации команды.ERR:

.ERR1 — ошибка при первом проходе ассемблирования;

.ERR2 — ошибка при втором проходе ассемблирования;

.ERRE выражение — ошибка, если выражение равно нулю (ложно);

.ERRNZ выражение — ошибка, если выражение не равно нулю (истинно);

.ERRDEF метка — ошибка, если метка определена;

.ERRNDEF метка — ошибка, если метка не определена;

.ERRB <аргумент> — ошибка, если аргумент пуст (эта и все следующие директивы используются в макроопределениях для проверки параметров);

.ERRNB <аргумент> — ошибка, если аргумент не пуст;

.ERRDIF <арг1>,<арг2> — ошибка, если аргументы различны;

.ERRDIFI <арг1>,<арг2> — ошибка, если аргументы отличаются (сравнение не различает большие и маленькие буквы);

.ERRIDN <арг1>,<арг2> — ошибка, если аргументы совпадают;

.ERRIDNI <арг1>,<арг2> — ошибка, если аргументы совпадают (сравнение не различает большие и маленькие буквы).

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

Оператор <> (угловые скобки). Часть выражения, заключенная в угловые скобки, не вычисляется, а применяется как строка символов, например:

message1 equ <foobar>

Оператор () (круглые скобки). Часть выражения, заключенная в круглые скобки, вычисляется в первую очередь.

mov al, 2*(3+4); mov al,14

Арифметические операторы: + (плюс), – (минус), * (умножение), / (целочисленное деление), MOD (остаток от деления). Они выполняют соответствующие арифметические действия.

mov al,90 mod 7; mov al,6

Кроме того, к арифметическим операторам относится унарный минус — минус, который ставят перед отрицательным числом.

Логические операторы: AND (И), NOT (НЕ), OR (ИЛИ), XOR (исключающее ИЛИ), SHL (сдвиг влево), SHR (сдвиг вправо). Эти операторы выполняют соответствующие логические действия.

mov ax,1234h AND 4321h; mov ax,0220h

Операторы сравнения: EQ (равно), GE (больше или равно), GT (больше), LE (меньше или равно), LT (меньше), NE (не равно). Результат действия каждого из этих операторов — единица, если условие выполняется, и ноль — если не выполняется.

.errnz $ gt 65535; Если адрес больше 64 Кб – ошибка

Операторы адресации:

SEG выражение — сегментный адрес;

OFFSET выражение — смещение;

THIS тип — текущий адрес (MASM и TASM);

Тип PTR выражение — переопределение типа;

LARGE выражение — 32-битное смещение (TASM и WASM);

SMALL выражение — 16-битное смещение (TASM и WASM);

SHORT выражение — 8-битное смещение.

SEG и OFFSET возвращают соответствующую часть адреса своего аргумента:

mov dx, offset msg; Занести в DX смещение переменной msg

THIS создает операнд, адресом которого является текущее значение счетчика:

mov al, this byte-1; Занести в AX последний байт кода; предыдущей команды.

PTR создает аргумент, адресом которого является значение выражения, а тип указан явно:

mov dword ptr [si],0; Записать 4 байта нулей по адресу DS:SI

LARGE, SMALL и SHORT используются с командами передачи управления, если возникают двусмысленности при косвенных переходах:

jmp large dword ptr old_address; Переменная old_address содержит 32-битное смещение jmp small dword ptr old_address; Переменная old_address содержит 16-битный сегментный адрес; и 16-битное смещение. jmp short short_label; Метка short_label находится; ближе, чем +128/-127 байт от этой команды, так что можно; использовать короткую форму команды JMP.

Другие операторы:

. (точка) — ссылка на элемент структуры;

: (двоеточие) — переопределение сегмента;

[] (прямые скобки) — косвенная адресация;

? — неинициализированное значение;

число DUP (значение) — повторяющееся значение.

Эти пять операторов описаны ранее, когда говорилось о структурах данных, методах адресации и псевдокомандах определения данных.




Дата добавления: 2015-01-30; просмотров: 156 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав