Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп_АПЗ_ПК_12_1.doc
Скачиваний:
30
Добавлен:
23.11.2019
Размер:
624.13 Кб
Скачать

Псевдокоманда times

Директива TIMES – это псевдокоманда префиксного типа, то есть она используется только в паре с другой командой. Она повторяет последующую псевдокоманду указанное количество раз, подобно директиве DUP из ассемблера Borland TASM.

Применяется эта директива в тех случаях, когда нужно «забить» некоторую область памяти повторяющимся образцом. Следующий код определяет строку, состоящую из 64 повторяющихся «Hello»:

many_hello: times 64 db 'Hello'

Первый аргумент, указывающий количество повторений, может быть и выражением. Например, задачу «разместить строку в области памяти размером в 32 байта и заполнить пробелами оставшееся место» легко решить с помощью директивы TIMES:

buffer db "Hello" ; определяем строку

times 32-($-buffer) db ' ' ; определяем нужное кол-тво пробелов

Выражение 32-($-buffer) возвратит значение 27, потому что $-buffer равно текущей позиции минус позиция начала строки, то есть 5.

Вместе с TIMES можно использовать не только псевдокоманды, но и команды процессора:

times 5 inc eax ; 5 раз выполнить INC EAX

Лекция 8. Команды пересылки данных и логические команды языка Ассемблера

8.1. Команды пересылки данных

Прежде чем изменять каким-либо образом данные, необходимо научиться их сохранять: копировать из регистра в память и обратно. Ведь прежде чем оперировать данными в регистрах, их сначала туда надо поместить.

Команда MOV, хоть название ее и происходит от слова «move» (перемещать), на самом деле не перемещает, а копирует значение из источника в приемник:

MOV приемник,источник

Процессоры семейства х86 позволяют использовать в командах только один косвенный аргумент. Следующая команда копирования значения, находящегося по адресу number_one, в область памяти с адресом number_two, недопустима:

mov [number_two],[number_one] ;НЕПРАВИЛЬНО!!!

Чтобы скопировать значение из одной области памяти в другую, нужно использовать промежуточный регистр:

mov ax,[number_one] ; загружаем в АХ 16-битное

; значение "number_one"

mov [number_two],ах ; а затем копируем его в переменную

; "number_two"

Оба операнда команды MOV должны быть одного размера: например, для копирования значения BL в регистр АХ мы должны «расширить диапазон», то есть скопировать весь ВХ в АХ, а затем загрузить 0 в АХ:

mov ах,bх ; загружаем ВХ в АХ

mov ah,0 ; "сбрасываем" верхнюю часть

; АХ – записываем в нее 0

Можно поступить и наоборот: сначала сбросить весь АХ, а затем загрузить BL в младшую часть АХ (AL):

mov ах,0 ; АН = 0, AL = 0

mov al,bl ; заносим в AL значение BL

Точно так же можно скопировать 16-битное значение в 32-битный регистр.

В официальной документации приведены все допустимые форматы команды MOV:

MOV r/m8,reg8

MOV r/m16,regl6

MOV r/m32,reg32

MOV reg8,r/m8

MOV reg16,r/ml6

MOV reg32,r/m32

MOV reg8,imm8

MOV reg16,imml6

MOV reg32,imm32

MOV r/m8,imm8

MOV r/m16,imml6

MOV r/m32,imm32

8.2. Логические команды языка Ассемблера

К логическим операциям относятся: логическое умножение (И, AND), логическое сложение (ИЛИ, OR), исключающее ИЛИ (XOR) и отрицание (NOT). Все эти инструкции изменяют регистр признаков.

Команда AND

Команда AND выполняет логическое умножение двух операндов: o1 и о2. Результат сохраняется в операнде o1. Типы операндов такие же, как у команды ADD: операнды могут быть 8-, 16- или 32-битными регистрами, адресами памяти или непосредственными значениями.

AND o1, o2

Таблица истинности для оператора AND приведена ниже (табл. 8.1).

Команда OR

Команда OR выполняет логическое сложение двух операндов: o1 и о2. Результат сохраняется в операнде o1. Типы операндов такие же, как у команды AND.

OR o1, o2

Таблица истинности для оператора OR приведена ниже (табл. 8.1).

Команда XOR

Вычисляет так называемое «исключающее ИЛИ» операндов: o1 и о2. Результат сохраняется в о1. Типы операндов такие же, как у предыдущих инструкций. Формат команды:

XOR o1, о2

Таблица истинности для оператора XOR приведена ниже (табл. 8.1). Исключающее ИЛИ обратимо: выражение ((х XOR у) XOR у) снова возвратит х.

Команда NOT

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

NOT r/m8 NOT r/m16 NOT r/m32

Таблица истинности для оператора NOT приведена ниже (табл. 8.1).

Табл. 8.1

a

b

a AND b

a OR b

a XOR b

NOT a

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0