- •3.11.1 Команды пересылки данных
- •Команды пересылки общего назначения
- •Xchg приемник, источник
- •Команды загрузки адресных значений
- •Команды обращения к стеку
- •Команды пересылки флагов
- •Команды ввода/вывода
- •In аккумулятор, порт
- •In аккумулятор, dx.
- •3.11.2. Арифметические команды
- •Типы арифметических данных
- •Команды инкрементирования и декрементирования
- •Inc приемник
- •Команды сложения и вычитания
- •Команды расширения знака
- •Команды умножения и деления
- •Imul источник.
- •Команды десятичной коррекции
- •Сложение в bdc-формате
- •Вычитание в bcd-формате
- •Сложение в ascii-формате
- •Вычитание в ascii-формате
- •Умножение в ascii-формате
- •Деление в ascii-формате
- •3.11.3 Логические команды
- •Команды логических операций
- •Команды сравнения
- •Команды сдвигов
- •Команды логических сдвигов
- •Команды арифметических сдвигов
- •Команды циклических сдвигов
- •3.11.4. Команды передачи управления
- •Команды безусловных переходов
- •Команды условных переходов
- •Команды перехода по состоянию арифметических флагов
- •Команды перехода по соотношению между числами
- •Команды перехода по состоянию регистра cx
- •Команды управления циклами
- •Команды для организации подпрограмм
- •Команды прерываний
- •3.11.5. Команды обработки строк
- •Строковые примитивы
Команды обращения к стеку
Команды обращения к стеку PUSH и POP имеют формат:
PUSH источник
POP приемник
и обеспечивают пересылку слов между стеком системы и регистрами МП или ячейками памяти.
Команда PUSH дважды декрементирует указатель стека SP и помещает содержимое указанного 16-битного регистра или ячейки памяти по этому адресу, то есть на верхушку стека. В результате стек расширяется в сторону меньших адресов. Регистр SP всегда указывает на последнее слово, включенное в стек.
Команда POP извлекает слово с верхушки стека и помещает его в указанный 16-битный регистр или ячейку памяти. После этого содержимое указателя стека SP дважды инкрементируется, и он вновь указывает на верхушку стека. В команде POP в качестве приемника данных нельзя указывать сегментный регистр CS, так как его изменение будет эквивалентно переходу, что не должно реализовываться командами пересылки данных.
Будучи взаимно обратными, команды PUSH и POP обычно используются парами, то есть каждой команде PUSH в программе должна соответствовать своя команда POP. При этом последовательность команд POP по используемым операндам должна быть обратна последовательности команд PUSH.
Пример 3.51:
PUSH SI ; Сохранение регистров в стеке
PUSH DS
. . . . . . .
POP DS ; Восстановление регистров из стека
POP SI
PUSH Counter ; Сохранение слов памяти в стеке
PUSH Table[BX][DI]
. . . . . . .
POP Alpha ; Запись в память слов из стека
POP [BX+SI]
Чаще всего стек используется для временного хранения данных. Однако, он может использоваться и в качестве буфера при некоторых пересылках.
Пример 3.52:
PUSH ES ; Копирование ES в DS через
POP DS ; стек
MOV AX, ES ; Альтернативное копирование
MOV DS, AX ; ES в DS через регистр
Команды пересылки флагов
К этой подгруппе относятся команды PUSHF, POPF и LAHF, SAHF.
Команды PUSHF и POPF пересылают содержимое полного регистра флагов F в стек и обратно соответственно. Они практически идентичны командам PUSH и POP, но не требуют указания операнда, так как таковым для них является только регистр флагов.
После пересылки в стек может быть изменено состояние флага трассировки TF(бит D8), что является единственным способом его формирования, так как команды прямого управления этим флагом отсутствуют. После загрузки установленного в единичное значение флага TF в регистр флагов, МП перейдет в режим трассировки.
Пример 3.53:
PUSHF ; Переключение МП
MOV BP,SP ; в режим трассировки
OR WORD PTR[BP], 0100h
POPF
Команды LAHF и SAHF пересылают младший байт регистра флагов F соответственно в регистр AH и обратно. Эти команды введены для обеспечения программной совместимости МП ВМ86/ВМ88 с МП ВМ80/ВМ85.
Пример 3.54:
LAHF ; Эквивалент команды PUSH PSW
PUSH AX ; МП ВМ80/ВМ85
. . . . . .
POP AX ; Эквивалент команды POP PSW
SAHF ; МП ВМ80/ВМ85
Команды ввода/вывода
К этой подгруппе относятся команды IN и OUT.
Команда ввода IN осуществляет ввод байта или слова из порта ввода в аккумулятор МП. В ней может использоваться прямая или косвенная адресация порта ввода. В соответствии с этим она записывается в двух форматах: