Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

'Решение'
рассмотрев в открытом судебном заседании гражданское дело по заявлению Р. о признании недействующим пункта 42 Правил сдачи квалификационных экзаменов ...полностью>>
'Документ'
Что является частотной характеристикой усилителя? Укажите роль частотной характеристики при выборе приборов в медицинских и биологических исследования...полностью>>
'Документ'
Подготовка и проведение научной конференции отдела медицины и биомедицины Малой Академии Наук с участием студентов, школьников в рамках «Дни Университ...полностью>>
'Программа дисциплины'
Национальный исследовательский университет «Высшая школа экономики»Программа дисциплины для направления/ специальности подготовки бакалавра/ магистра/...полностью>>

Главная > Документ

Сохрани ссылку в одной из сетей:
Информация о документе
Дата добавления:
Размер:
Доступные форматы для скачивания:

[===== Лекция № 03: «Команды языка Assembler» =====]

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

Все команды Assembler-а делятся на целочисленные и нецелочисленные (с плавающей точкой). Целочисленные – выполняются процессором, их мы и будем изучать. Нецелочисленные – математическим сопроцессором, за рамками курса.

Целочисленные команды:

Поскольку Assembler отличается от других языков тем, что все его команды элементарны, и для выполнения любого действия требуется написать в программе целых блок команд, основную часть программы составляют комментарии. Иначе вы уже через 5 минут забудете, что вы имели ввиду раньше. Комментарий начинается с символа ; и продолжается до конца строки.

1) Пересылка данных:

MOV AX, BX ; AX = BX - присвоение значения (после ; идет комментарий до конца строки)

; AX - приемник (первым всегда имя переменной или регистра - туда сохр. результат)

; BX - источник (может быть как имя, так и значение - число)

MOV AH, 11 ; AH = 11 – присвоить число 11 в десятичной системе

MOV AL, 11h ; AL = 1116 – присвоить число 11 в шестнадцатиричной системе (=1710)

MOV BX, 002Fh ; BX = 2F16 - необходимо следить за совпадением разрядности операндов

MOV CX, 1111000011110000b ; CX = F0F016 – пример присвоения двоичных чисел

XCHG AX, BX ; меняет значения местами (оба должны быть одинаковой разрядности)

PUSH AX ; помещает AX в стек (PUSH AL – нельзя, почему? …элемент стека - 2 байта)

POP AX ; извлекает слово из стека и помещает его в AX

Примечание: если требуется записать 16-ричное число, начинающееся с буквы (F4CD), то будет сообщение об ошибке. Дебаггер подумает, что это имя переменной и не найдет такого. Поэтому надо поставить старший ноль (0F4CD), тогда все сработает как надо.

2) Арифметические операции (двоичная и десятичная арифметики):

ADD AX, BX ; AX = AX + BX - сложение (результат всегда в первом операнде - приемнике)

INC AX ; AX = AX + 1 - инкремент

SUB AX, BX ; AX = AX - BX - вычитание (результат всегда в первом операнде - приемнике)

DEC AX ; AX = AX - 1 - декремент

NEG DX ; переводит в дополнительный код и обратно (смена знака числа)

3) Логические операции (манипуляции с битами):

NOT AX ; инверсия (поразрядное отрицание); зная ее мы можем написать замену ; команде NEG AX = NOT AX + INC AX (но не будем, т.к. NEG - выгоднее)

MOV AX, 0017h ; присвоим в AX начальное значение 0000 0000 0001 01112

AND AX, 0152h ; поразрядное наложение на AX маски 0000 0001 0101 00102

0000 0000 0001 0111 – значение в AX (в командах нам будет удобнее задавать 16-ричные числа)

0000 0001 0101 0010 – маска (так что не забываем правила быстрого перевода X2Y16)

-----------------------------

0

1

000 0000 0001 0010 (в AX обнуляются биты, где в маске стоят нули, прочие - без изменений)

MOV AX, 0017h ; присвоим в AX начальное значение 0000 0000 0001 01112

OR AX, 0152h ; поразрядное дополнение AX маской 0000 0001 0101 00102

0000 0000 0001 0111 – значение в AX (из прошлого примера)

0000 0001 0101 0010 – маска (из прошлого примера)

-----------------------------

0000 0001 0101 0111 (в AX единицы в тех битах, где в маске стоят единицы, прочие - без изменений)

MOV AX, 0017h ; присвоим в AX начальное значение 0000 0000 0001 01112

XOR AX, 0152h ; шифрование AX по маске 0000 0001 0101 00102

0000 0000 0001 0111 – значение в AX

0000 0001 0101 0010 – маска (чтобы расшифровать число, нужно наложить ту же маску еще раз)

-----------------------------

0000 0001 0100 0101 (в AX инвертируются биты, где в маске стоят единицы, прочие - без изменений)

SHL AX, 1 ; сдвиг AX на 1 разряд влево (умножение на 2, старшие могут ”потеряться”)

SHR AX, 3 ; сдвиг AX на 3 разряда вправо (деление нацело на 8, младшие - отбрасываются)

TEST AX, 0103h ; проверяет те разряды AX, которые указаны в маске 0000 0001 0000 0011

; FZ = 0 если в AX есть хоть одна единица среди указанных, FZ = 1 если ни одной

CMP AX, BX ; анализирует разность (AX - BX), устанавливает флаги FZ и FS

; флаг знаков: FS = 0 если AX-BX≥0, FS = 1 если AX-BX<0 (0 – ”+”, 1 – ”-”)

; флаг значений: FZ = 0 если AX≠BX, FZ = 1 если AX=BX (разность = или ≠ 0)

Примечание: команды TEST и CMP только меняют флаги, значения операндов остаются прежними!

Пример взаимозаменяемости команд: задача - обнулить AX

1. MOV AX, 0000h

2. SUB AX, AX

3. AND AX, 0000h

4. XOR AX, AX ; наиболее быстрый способ (без лишней пересылки данных)

5. SHR AX, 16

4) Передача управления (безусловный и условный переход):

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

METKA1: ........

JMP METKA1 ; безусловный переход к указанной метке (вверх или вниз)

Переход по условию:

JS METKA ; переход происходит, если FS = 1 (буква S в имени команды – указывает флаг)

JNS METKA ; переход происходит, если FS = 0 (буква N в имени команды – как бы отрицание)

JZ METKA ; переход происходит, если FZ = 1 (буква Z в имени команды – указывает флаг)

JNZ METKA ; переход происходит, если FZ = 0 (буква N в имени команды – как бы отрицание)

Цикл с параметром (CX – используется по умолчанию в качестве счетчика):

MOV CX, 5 ; установим количество повторов цикла

METKA2: ............................

… тело цикла ... ; блок команд, которые надо повторить в цикле (регистр CX - занят)

............................

2

LOOP METKA2 ; если CX≠0, то уменьшает CX на 1 и возвращается вверх к метке

5) Цепочечные (выполнение действий над заданной цепочкой данных): пропускаем

6) Управление состоянием ЦП:

INT <номер> ; вызов прерывания (когда обращаемся к какой-либо стандартной функции)

Пример:

; [=== Стандартное завершение программы ===]

MOV AH, 4Ch ; номер функции из библиотеки данного прерывания, которую мы хотим вызвать

; 4C - передача управления родительской задаче (т.е. операционной системе)

MOV AL, 00h ; передаваемый в функцию параметр (выход с кодом 0, т.е. без ошибки)

; можно было сразу присвоить MOV AX, 4C00h, но в две строки вам нагляднее

INT 21h ; вызов прерывания DOS – выполняется указанная функция (завершение работы)

Если в конце программы не поставить такой блок команд, то дебаггер не узнает, что программа завершена, и продолжит считывать из памяти и выполнять всякий ”мусор”!

Как видите, команда INT всегда обращается к регистру AX, чтобы узнать исходные данные вызова – номер библиотечной функции, передаваемый параметр. Кроме того, некоторые функции будут обращаться за данными к регистру DX и совсем редко – к BX, но об этом позже.



Похожие документы:

  1. Эту файловую систему используют такие операционные системы, как Windows nt/2000/XP. При установке ntfs, диск разделяется на две неравные части: первая отводитьс

    Документ
    ... последовательно выполняет все команды в текстовом файле, что позволяет не вводить их вручную. Этап 2 Для ... исполняемого кода в обычную программу ... программ. Поскольку этот путь загрузки обычными пользователями уже изрядно подзабыт, его нередко используют ...
  2. Увсего отдела продаж слетает программа, все начинют визжать и дергать it: работы мол много, чини. Каждые 20 минут спрашивают ну что долго, долго еще?! Вэто время каждый сидит, кто фотки смотрит, кто в косынку рубится

    Программа
    ... пользователями и спецустройствами. Иногда для определенных целей по инициативе программы ... поскольку комнатка не использовалась ... разработанная ВНИИС'ом специально для ... последовательность была частью слова "Button1", и только один раз – исполняемым кодом ...

Другие похожие документы..