- •Министерство образования российской федерации ижевский государственный технический университет
- •1. Методика выполнения лабораторных работ
- •2. Основные сведения об ассемблере
- •2.1. Регистры процессора
- •2.2. Команды ассемблера
- •2.3. Прерывания ассемблера
- •4. Режимы адресации команд
- •5. Байт способа адресации
- •6. Режимы адресации переходов
- •7. Система команд
- •7.1. Команды пересылки
- •7.1.1. Общие команды пересылки данных
- •7.1.1.2. Xchg - перестановка
- •7.1.1.3. Xlat - перекодировка
- •7.1.1.7. Команда lahf - загрузка флагов в регистр ан
- •7.1.1.8. Sahf - установка флагов из регистра ан
- •7.1.2. Команды пересылки данных с использованием стека (стековые команды)
- •7.1.3. Команды ввода - вывода
- •1.4. Команды пересылки цепочек байт или слов (цепочечные команды)
- •7.1.4.1. Movs - пересылка строки байтов или слов
- •7.1.4.2. Movsb/movsw - пересылка строки байтов или слов
- •7.1.4.3. Lods - загрузка строки байтов или слов
- •7.1.4.8. Cmpsb/cmpsw - сравнение строки байтов или слов
- •7.1.4.9. Scas - сканирование строки байтов или слов
- •7.1.4.10. Scasb/scasw - сканирование строки байтов или слов
- •7.2. Арифметические команды
- •7.2.1. Команды сложения
- •7.2.2. Команды вычитания
- •7.2.3. Команды сравнения
- •7.2.4. Команды умножения
- •7.2.4.2. Imul - умножение знаковых величин
- •7.2.5. Команды деления
- •7.2.5.2. Idiv - деление знаковых величин
- •7.3. Логические команды
- •7.4. Команды сдвигов
- •7.5. Команды переходов (передачи управления)
- •7.5.1. Команды безусловных переходов
- •7.5.2. Команды условных переходов
- •7.5.3. Команды вызовов (подпрограммы)
- •7.5.4. Команды возвратов (из подпрограмм)
- •7.5.5. Команды управления циклами
- •7.5.6. Команды прерываний
- •7.6. Команды управления микропроцессором
- •8. Примеры выполнения лабораторных работ
- •9. Учебно-методическая литература
- •Описание команд отладчика debug
- •Команды процессора 8086
- •1. Команды пересылки данных
- •1.1. Общие команды пересылки данных
- •Xlat Перекодировка
- •Xchg Перестановка
- •1.2. Стековые команды
- •1.3. Команды ввода-вывода
- •In Ввод байта или слова из порта
- •1.4. Команды пересылки цепочек
- •2. Арифметические команды
- •2.1. Команды сложения
- •Inc Инкремент
- •2.2. Команды вычитания
- •2.3. Команды сравнения
- •2.4. Команды умножения
- •Imul Целое умножение знаковых величин
- •2.5. Команды деления
- •Idiv Целое деление знаковых величин
- •3. Логические команды
- •Xor Исключающее или
- •4. Команды сдвигов
- •5. Команды передачи управления
- •5.1. Команды вызова процедуры
- •5.2. Команды прерываний
- •Int Прерывание
- •Into Прерывание по переполнению
- •Iret Возврат из обработки прерывания
- •5.3. Команды условных переходов
- •5.4. Команды безусловных переходов
- •5.5. Команды управления циклами
- •6. Команды управления процессором
7.1.1.7. Команда lahf - загрузка флагов в регистр ан
Эта команда осуществляет передачу младшего байта регистра флагов в регистр АН. Состояние самих флагов при этом не изменяются.
10011111
7.1.1.8. Sahf - установка флагов из регистра ан
Команда SAHF реализует обратную передачу: содержимое регистра АН передается в младший байт регистра флагов. Старший байт регистра флагов не изменяется.
10011110
7.1.2. Команды пересылки данных с использованием стека (стековые команды)
Все стековые команды манипулируют только со словами и сопровождаются автоматической модификацией указателя стека. При включении в стек производится декремент, а при извлечении из стека - инкремент регистра SP. До выполнения стековых команд необходимо инициализировать регистры SP и SS. Кроме того, каждой команде РОР должна предшествовать команда PUSH.
Команда PUSH включает в стек содержимое адресуемого регистра или ячейки памяти, а команда РОР извлекает содержимое вершины стека и переходит в общий регистр или ячейку памяти.
Формат команд:
1) PUSH mem/reg
POP mem/reg
2) PUSH reg
POP reg
3) PUSH sreg
POP sreg
Пример:
[DS] = 2800
[BX] = 0400
[SP] = 1000
[SS] = 2F00
[28400] = A020
PUSH [BX]
[28FFFE] = A020
[SP] = 0FFE
Команды PUSHF и POPF предназначены для временного запоминания в стеке и последующего восстановления из стека содержимого 16 - битного флагового регистра.
Команда PUSHA - занесение в стек всех регистров
01100000
Команда PUSHA записывает в стек восемь значений регистров: AX, CX, DX , BX, SP, BP, SI, DI в указанной последовательности и уменьшает регистр SP на 16.
Команда POPA - извлечение из стека всех общих регистров
01100001
Команда РОРА извлекает из стека восемь значений в регистры: DI, SI, BP, SP, BX, CX, AX в указанной последовательности и увеличивает регистр SP на 16. (8088, 80186, 80286).
7.1.3. Команды ввода - вывода
Порт представляет собой устройство, которое соединяет процессор с внешним миром. Через порт процессор получает сигналы с устройств ввода и посылает сигналы на устройства вывода. Теоретически процессор может управлять до 65536 портами, начиная с нулевого порта. Для управления вводом - выводом непосредственно на уровне порта используются команды IN и OUT.
7.1.3.1. IN - ввод байта или слова из порта
Команда IN передает из порта один байт в регистр AL или слово в регистр AX. Порт кодируется как фиксированный числовой операнд или как переменная а регистре DX.
Формат команды IN:
1) IN ac, port
1110010 wport
2) IN ac, DX
1110110 w
Пример ввода байта с клавиатуры (из порта 60h)
MOV DX, 60h
IN AL, DX
7.1.3.2. OUT - вывод байта или слова в порт
Команда OUT передает в порт байт из регистра AL или слово из регистра AX. Порт задается как фиксированный числовой операнд или как преременная в регистре DX.
Формат команды:
1) OUT port, ac
1110011 wport
2) OUT DX, ac
1110111 w
1.4. Команды пересылки цепочек байт или слов (цепочечные команды)
Пять базовых строковых операций, называемых примитивами, позволяют оперировать со строками байтов или слов по одному элементу (байту или слову) за раз. Эти операции могут обрабатывать строки длиной до 64К. Операции со строками обеспечивают пересылку, сравнение, сканирование строк по значению, а также пересылку элементов строки в аккумулятор или из него. Этим базовыми инструкциям может предшествовать однобайтный префикс, наличие которого обеспечивает многократное повторение инструкции аппаратным способом, что гарантирует более высокое быстродействие, чем в случае программного цикла. Процесс повторения может быть прекращен при возникновении различных ситуаций, а сама повторяемая операция может быть как прервана, так и возобновлена.
Строковые инструкции во многом похожи друг на друга. Они могут иметь операнд-приемник, операнд-источник или оба эти операнда. Аппаратно предполагается, что исходная строка размещена в текущем сегменте данных (для ее адресации используется регистр DS); для изменения этого допущения может использоваться однобайтный префикс изменения сегмента.
Строка-приемник должна размещаться в текущем экстра сегменте (для ее адресации используется регистр ES). Для проверки того, что является элементом строки (байт или слово), ассемблер проверяет атрибуты операндов инструкции. Однако, в действительности эти операнды для адресации строк не используются. Для адресации используются регистры SI, который предполагается загруженным значением смещения строки-источника относительно содержимого DS, и DI, содержимое которого трактуется как смещение строки-приемника относительно содержимого ES. Все эти регистры должны быть загружены требуемыми значениями до выполнения строковой операции, для чего могут использоваться инструкции LDS, LES и LEA.
Строковые инструкции автоматически модифицируют содержимое регистров SI и/или DI для обеспечения возможности обработки следующего элемента строки. Значение флага направления DF определяет, будут ли эти индексные регистры автоматически увеличиваться (DF=0) или автоматически уменьшаться (DF=1) при переходе к следующему элементу строки. При обработке строк байтов содержимое SI и/или DI изменяется на 1; в случае строк слов - на 2.
При использовании префикса повторений содержимое регистра CX уменьшается на 1 после каждого повторения строковой инструкции. Регистр CX должен быть загружен требуемым числом повторений до выполнений строковой операции. Если CX содержит 0, строковая операция не выполняется, и управление передается следующей инструкции.
REP/REPE/REPZ/REPNE/REPNZ - префиксы повторения
Эти ключевые слова представляют собой 5 мнемоник 2-х форм однобайтного префикса, управляющего повторением непосредственно следующей за ним строковой инструкции. Различные мнемоники введены для удобства программирования. Наличие префикса на состояния флагов не влияет. REP используется в сочетании с инструкциями MOVS и STOS и интерпретируется как "повторение пока не конец строки" (в CX не 0). REPE и REPZ работают также и физически являются тем же префиксом, что и REP. REPE и REPZ используются в сочетании с инструкциями CMPS и SCAS и требуют, чтобы флаг ZF, используемый этими инструкциями, был установлен в 1 до инициализации следующего повторения.
REPNE и REPNZ представляют собой 2 мнемоники одного префикса и функционируют также, как REPE и REPF, но флаг ZF должен быть установлен в 0, или повторение прекратится. Заметим, что устанавливать флаг ZF перед выполнением повторяемой строковой инструкции необязательно.