- •1. Предварительные сведения 6
- •2. Процессоры intel в реальном режиме 11
- •3. Директивы и операторы ассемблера 51
- •Введение
- •1. Предварительные сведения
- •1.1. Подготовка программ на языке ассемблера
- •1.2. Представление данных в компьютерах
- •1.2.1. Двоичная система счисления
- •1.2.2. Биты, байты и слова
- •1.2.3. Шестнадцатеричная система счисления
- •1.2.4. Числа со знаком
- •1.2.5. Логические операции
- •1.2.6. Коды символов
- •2. Процессоры intel в реальном режиме
- •2.1. Регистры процессора
- •2.1.1. Регистры общего назначения
- •2.1.2. Модели памяти и сегментные регистры
- •2.1.3. Стек
- •2.1.4. Регистр флагов
- •2.2.4. Косвенная адресация
- •2.2.5. Адресация по базе со смещением
- •2.2.6. Косвенная адресация с масштабированием
- •2.2.7. Адресация по базе с индексированием
- •2.2.8. Адресация по базе с индексированием и масштабированием
- •2.3. Основные непривилегированные команды
- •2.3.1. Пересылка данных
- •2.3.2. Двоичная арифметика
- •2.3.3. Десятичная арифметика
- •2.3.4. Логические операции
- •2.3.5. Сдвиговые операции
- •2.3.6. Операции над битами и байтами
- •2.3.7. Команды передачи управления
- •2.3.8. Строковые операции
- •2.3.9. Управление флагами
- •2.3.10. Загрузка сегментных регистров
- •2.3.11. Другие команды
- •3. Директивы и операторы ассемблера
- •3.1. Структура программы
- •3.2. Директивы распределения памяти
- •3.2.1. Псевдокоманды определения переменных
- •3.2.2. Структуры
- •3.3. Организация программы
- •3.3.1. Сегменты
- •3.3.2. Модели памяти и упрощенные директивы определения сегментов
- •3.3.4. Процедуры
- •3.3.5. Конец программы
- •3.3.6. Директивы задания набора допустимых команд
- •3.3.7. Директивы управления программным счетчиком
- •3.3.8. Глобальные объявления
- •3.3.9. Условное ассемблирование
- •3.4. Выражения
- •3.5. Макроопределения
- •3.5.1. Блоки повторений
- •3.5.2. Макрооператоры
- •3.5.3. Другие директивы, используемые в макроопределениях
- •3.6. Другие директивы
- •3.6.1. Управление файлами
- •3.6.2. Управление листингом
- •3.6.3. Комментарии
- •Литература
2.3.6. Операции над битами и байтами
• Команда: ВТ база,смещение
• Назначение: Проверка бита
• Процессор: 80386
Команда ВТ считывает во флаг CF значение бита из битовой строки (базы), указанной первым операндом (регистр или переменная), со смещением, указанным во втором операнде, битовом смещении (число или регистр). Если первый операнд — регистр, то битовой базой считается бит 0 в указанном регистре и смещение не может превышать 15 или 31 (в зависимости от размера регистра); если оно превышает эти границы, в качестве смещения будет использоваться остаток от деления его на 16 или 32 соответственно. Если первый операнд — переменная, то в качестве битовой базы используется бит 0 указанного байта в памяти, а смещение может принимать значения от 0 до 31, если оно указано непосредственно (старшие биты процессором игнорируются), и от –231 до 231–1, если оно указано в регистре.
Несмотря на то что эта команда считывает единственный бит из памяти, процессор считывает целое двойное слово по адресу База+(4*(Смещение/32)) или слово по адресу База+(2*(Смещение/16)), в зависимости от разрядности адреса, так что не следует пользоваться ВТ вблизи от недоступных для чтения областей памяти.
После выполнения команды ВТ флаг CF равен значению считанного бита, флаги OF, SF, ZF, AF и PF не определены.
• Команда: BTS база,смещение
• Назначение: Проверка и установка бита
• Команда: BTR база,смещение
• Назначение: Проверка и сброс бита
• Команда: ВТС база.смещение
• Назначение: Проверка и инверсия бита
• Процессор: 80386
Эти три команды соответственно устанавливают в 1 (BTS), сбрасывают в 0 (BTR) и инвертируют (ВТС) значение бита, который находится в битовой строке с началом, указанным в базе (регистр или переменная), и смещением, указанным во втором операнде (число от 0 до 31 или регистр). Если битовая база — регистр, то смещение не может превышать 15 или 31 в зависимости от разрядности этого регистра. Если битовая база — переменная в памяти, то смещение может принимать значения от –231 до 231–1 (если оно указано в регистре).
После выполнения команд BTS, BTR и ВТС флаг CF равен значению считанного бита до его изменения в результате действия команды, флаги OF, SF, ZF, AF и PF не определены.
• Команда: BSF приемник,источник
• Назначение: Прямой поиск бита
• Команда: BSR приемник,источник
• Назначение: Обратный поиск бита
• Процессор: 80386
BSF сканирует источник (регистр или переменная), начиная с самого младшего бита, и записывает в приемник (регистр) номер первого встретившегося бита, равного 1. Команда BSR сканирует источник, начиная с самого старшего бита, и возвращает номер первого встретившегося ненулевого бита, считая от нуля, то есть, если источник равен 0100 0000 0000 0010b, то BSF возвратит 1, а BSR — 14.
Если весь источник равен нулю, значение приемника не определено и флаг ZF устанавливается в 1, иначе ZF всегда сбрасывается. Флаги CF, OF, SF, AF и PF не определены.
• Команда: SETcc приемник
• Назначение: Установка байта по условию
• Процессор: 80386
Это набор команд, которые устанавливают приемник (восьмибитный регистр или переменная размером в один байт) в 1 или 0, если удовлетворяется или не удовлетворяется определенное условие. Условием в каждом случае реально является состояние тех или иных флагов, но, если команда из набора SETcc используется сразу после СМР, условия приобретают формулировки, соответствующие отношениям между операндами СМР (см. табл. 6). Скажем, если операнды СМР были неравны, то команда SETNE, выполненная сразу после этого СМР, установит значение своего операнда в 1.
Слова «выше» и «ниже» в таблице относятся к сравнению чисел без знака, слова «больше» и «меньше» учитывают знак.
-
Таблица 6. Команды SETcc
Код команды
Реальное условие
Условие для СМР
SEТА
SETNBE
CF = 0 и ZF = 0
если выше
если не ниже или равно
SETAE
SETNB
SETNC
CF = 0
если выше или равно
если не ниже
если нет переноса
SETB
SETNAE
SETNA
CF = 1
если ниже
если не выше или равно
если перенос
SETBE
SETNA
CF = 1 и ZF = 1
если ниже или равно
если не выше
SETE
SETZ
ZF = 1
если равно
если ноль
SETG
SETNLE
ZF = 0и SF = OF
если больше
если не меньше или равно
SETGE
SETNL
SF = OF
если больше или равно
если не меньше
SETL
SETNGE
SF <> OF
если меньше
если не больше или равно
SETLE
SETNG
ZF = 1 и SF <> OF
если меньше или равно
если не больше
SETNE
SETNZ
ZF = 0
если не равно
если не ноль
SETNO
OF = 0
если нет переполнения
SETO
OF = 1
если есть переполнение
SETNP
SETPO
PF = 0
если нет четности
если нечетное
SETP
SETPE
PF = 1
если есть четность
если четное
SETNS
SF = 0
если нет знака
SETS
SF = 1
если есть знак